我目前正在编写一个程序,需要在String的ArrayList的ArrayList中将类似的字符串与Damerau levenshtein算法进行比较。现在,我这样做的方式是通过嵌套的代码循环:
Damerau d = new Damerau();
for(int i = 0;i<outer.size();i++) {
System.out.println(i);
String cstring = outer.get(i).get(5);
for(ArrayList<String> current : outer) {
if(d.distance(cstring , current.get(5)) < 30){
//System.out.println(cstring);
outer.get(i).set(0, current.get(0));
break;
}
}
}
但由于arraylist由33000个字符串arraylists组成,所以这非常慢。
答案 0 :(得分:1)
因此,如果我正确理解您的代码,您可以按照以下方式执行操作:
for each outer as cstring : for each outer as current: levenshtein(cstring, current)
这意味着你进行了大量不必要的比较。假设您有一个包含字符串[a, b, c]
的列表,您正在测试的组合为[aa, ab, ac, ba, bb, bc, ca, cb, cc]
。这包括与它们自身的比较(aa, bb, cc
),它总是0,以及使用交换参数(ab,ba,ac,ca,bc,cb
)调用levenshtein函数,它们总是相同的。因此,如果您跳过相同的对和自我测试,则只需要测试组合ab,ac,bc
。通过在i + 1上启动内部循环,您可以非常轻松地在代码中实现这一点。