//Los comentarios se refieren a cambios respecto lo visto en clase
//Para dar por buena la clase habria que sustituirlos por los comentarios de documentación,
//y quizás alguno de explicación de código.
//Además de someterla a toda clase de test para descubrir debilidades y corregirlas.
package edu.ehu.gtts.gbg.babel;
import java.io.*;
import java.util.*;
public class Babel {
List<Language> languages=new ArrayList<>();
public Babel(String dirName) throws FileNotFoundException, IOException {
BufferedReader br=new BufferedReader(new FileReader(dirName+"/languages.txt"));
String line;
while ((line=br.readLine())!=null) {
line=line.trim();
if (line.length()==0) continue;
String id=line.split("\\s")[0];
try {
languages.add(new Language(id, line.substring(id.length()).trim(), dirName+"/txt/"+id+".txt"));
} catch (IOException ignore) {
}
};
br.close();
}
//Añado este método que nos resulta util en findMostSimilars y en main, y tiene sentido en todo caso.
Language getLanguage(String id) {
for (Language lan: languages) if (lan.getId().equals(id)) return lan;
return null;
}
public Language[] findMostSimilars(String id,int n){
//una vez que decido que la clase auxiliar LangSim sólo la uso en este método, decido hacerla local
class LangSim {
Language lA, lB;
double similarity;
public LangSim(Language lA, Language lB, double similaridad) {
this.lA = lA; this.lB = lB; this.similarity = similaridad;
}
}
Language lRef=getLanguage(id);
LangSim[] ls=new LangSim[languages.size()];
int i=0; for (Language l2: languages) ls[i++]=new LangSim(lRef,l2,Language.similarity(lRef, l2));
//Aquí cambio el cuerpo de compare(.) por algo más simple (ojo al "truco")
Arrays.sort(ls,new Comparator<LangSim>(){
@Override public int compare(LangSim o1, LangSim o2) {
return -( new Double(o1.similarity).compareTo(o2.similarity));
}
});
Language[] out=new Language[n];
for (i=0; i<n; i++) out[i]=ls[i+1].lB;
return out;
}
public static void main(String[] args) throws IOException {
Babel babel = new Babel("udhr");
//Hago la busqueda de los 10 más próximos para cuatro lenguajes concretos, Ojo al "truco"
Language lRef;
Language[] similar;
for (String id : new String[]{"spn", "gln", "cln", "bsq"}) {
lRef = babel.getLanguage(id);
similar = babel.findMostSimilars(id, 10);
//Uso una salida con formato
for (Language lan : similar)
System.out.printf("similaridad(%s,%s)=%.4f\n", lRef, lan, Language.similarity(lRef, lan));
}
}
}