Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 嵌套循环的更好替代方案_Java_Loops_Arraylist_Nested_Nested Loops - Fatal编程技术网

Java 嵌套循环的更好替代方案

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(

我目前正在编写一个程序,需要在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(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。您无法排序。