Closed GoogleCodeExporter closed 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
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
Original issue reported on code.google.com by
leonardo...@gmail.com
on 23 Apr 2009 at 3:53