skiel85 / speakit

Automatically exported from code.google.com/p/speakit
0 stars 0 forks source link

Codificador/decodificador de front coding #16

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
Codificador/decodificador de front coding

Original issue reported on code.google.com by leonardo...@gmail.com on 23 Apr 2009 at 3:53

GoogleCodeExporter commented 9 years ago
Se crearon pruebas sobre el front coding y el esqueleto de las clases. Está 
disponible para que alguien lo tome y lo implemente.

Original comment by NahuelQu...@gmail.com on 24 Apr 2009 at 2:44

GoogleCodeExporter commented 9 years ago
Finalizado.
Si bien el código que programó seba pasaba las pruebas, cuando me puse a 
utilizarlo para encodear registros en 
las hojas del bsharp detecté muchos errores. Hice mas pruebas al modulo de 
front coding y me di cuenta de que en realidad no codificaba en front coding, 
hacía otra cosa. En lugar de buscar si los caracteres iniciales 
matcheaban con la palabra anterior, miraba los caracteres que matcheaban en 
toda la palabra, no solo al 
principio.
Por ejemplo, si yo codificaba "verdeperro" y "rojosperro" devolvía (0, 
verdeperro) y (5,perro) en lugar de (0, 
verdeperro) y (0,rojosperro) que sería lo correcto.
Tuve que reacer todo el algoritmo del encoder para que funcionara correctamente.

Codigo anterior:

public class FrontCodingWordEncoder {

    private String lastWord = null; 

    /**
     * Metodo que comprime una palabra.
     * 
     * @param string
     * @return FrontCodedWord
     */
    public FrontCodedWord encode(String string) {
        FrontCodedWord encodedWord;
        if(lastWord == null){
            lastWord = string;
            encodedWord = new FrontCodedWord((short)0, string);
        }else{
            short matchingCharacters = compare (lastWord,string);
            lastWord = string;
            String endingCharacters = "";
            char[] charsOfString = new char[string.length()];
            charsOfString = string.toCharArray();
            short position = matchingCharacters;
            while(position < (short)string.length()){
                endingCharacters = endingCharacters + charsOfString[position];
                position++;
            }
            encodedWord = new FrontCodedWord(matchingCharacters,endingCharacters);
        }
        return encodedWord;
    }

    /**
     * Metodo para comparar cantidad de caracteres iguales en 2 strings
     * 
     * @param string1
     * @param string2
     *            
     */
    private short compare (String string1, String string2){
        short equalsCharacters = 0;
        int position = 0;
        char[] charactersOfString1 = new char[string1.length()];
        char[] charactersOfString2 = new char[string2.length()];
        charactersOfString1 = string1.toCharArray();
        charactersOfString2 = string2.toCharArray();
        if(string1.length()<string2.length()){
            while(position<string1.length()){
                if(charactersOfString1[position] == charactersOfString2[position]){
                    equalsCharacters++;
                    position++;

                }else{
                    position++;
                }
            }
        }else{
            if(string2.length()<string1.length()){
                while(position<string2.length()){
                    if(charactersOfString1[position] == charactersOfString2[position]){
                        equalsCharacters++;
                        position++;

                    }else{
                        position++;
                    }
                }
            }else{
                while(position<string1.length()){
                    if(charactersOfString1[position] == charactersOfString2[position]){
                        equalsCharacters++;
                        position++;

                    }else{
                        position++;
                    }
                }
            }

        }

        return equalsCharacters;
    }

}

Codigo Actual:

public class FrontCodingWordEncoder {

    private String  lastWord    = null;

    /**
     * Metodo que comprime una palabra.
     * 
     * @param string
     * @return FrontCodedWord
     */
    public FrontCodedWord encode(String string) {
        FrontCodedWord encodedWord;
        if (lastWord == null) {
            lastWord = string;
            return new FrontCodedWord((short) 0, string);
        } else {
            short frontMatchingCharacters = calculateFrontMatchingCharacters(lastWord, string);
            lastWord = string; 
            String ending = "";
            if(frontMatchingCharacters<string.length()){
                ending=string.substring(frontMatchingCharacters);   
            }else{
                //Caso de que matchee toda la palabra dentro de la anterior
                ending="";
            }
            return new FrontCodedWord(frontMatchingCharacters, ending); 
        } 
    }

    /**
     * Compara la cantidad de caracteres iniciales que coinciden
     * 
     * @param string1
     * @param string2
     * 
     */
    private short calculateFrontMatchingCharacters(String string1, String string2) {
        short shorterArrayLenght = min((short) string1.length(), (short) string2.length());
        for (short i = 0; i < shorterArrayLenght; i++) {
            if (string1.charAt(i) != string2.charAt(i)) {
                return i;
            }
        }
        return shorterArrayLenght;
    }

    private short min(short x, short y) {
        if (x < y) {
            return x;
        } else {
            return y;
        }
    }

}

Original comment by NahuelQu...@gmail.com on 7 May 2009 at 11:14