Java 嵌套循环的更好替代方案
我目前正在编写一个程序,需要在ArrayList of ArrayList of String中将类似的字符串与Damerau levenshtein算法进行比较。现在,我这样做的方式是通过一个嵌套的代码循环:Java 嵌套循环的更好替代方案,java,loops,arraylist,nested,nested-loops,Java,Loops,Arraylist,Nested,Nested Loops,我目前正在编写一个程序,需要在ArrayList of ArrayList of String中将类似的字符串与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(
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;
}
}
}
Damerau d=new-Damerau();
对于(int i=0;i,因此,如果我正确理解了您的代码,您可以按照以下方式执行操作:
for each outer as cstring :
for each outer as current:
levenshtein(cstring, current)
对于每个外环:
对于每个外部as电流:
levenshtein(cstring,当前)
这意味着您要进行大量不必要的比较。假设您有一个包含字符串的列表[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上启动内部循环,您可以非常轻松地在代码中实现这一点。如果您从数据库读取数据,则不必获取所有数据,而只提取所需的数据。SQL查询是比较的比逐行比较更快。如果您不使用RDBMS,我建议您至少使用sqlite转储数据,并使用查询获取数据。另一件事是使用一些探查器工具,确定哪一行正在消耗越来越多的时间。如果可能,尝试在较小的列表和独立线程中拆分数据。您进行过基准测试吗标记代码以查看在哪里花费的时间最多?一个优化可能是只在外循环中获取outer.get(i)
一次,而不是在每个内循环迭代中获取它。如何标记已检查的值以跳过它们?而不是只设置out.get(i)
如果匹配,您也可以更新当前的字符串。如果您正在比较相似的字符串,您是否尝试过对数据进行排序?@phflack算法比较字符串中的相似性字符串中的相似性不相似字符串
,因此Zen
和Ten
的相似距离为1。您无法排序。