嵌套循环

时间:2017-11-02 13:12:48

标签: java loops arraylist nested nested-loops

我目前正在编写一个程序,需要在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组成,所以这非常慢。

1 个答案:

答案 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上启动内部循环,您可以非常轻松地在代码中实现这一点。