无限循环Java出于不可思议的原因

时间:2016-11-29 18:41:19

标签: java loops iterator

代码应该将列表分成几组。如果ArrayList连续两次包含相同的字符串,它会将其索引添加到一个HashSet,否则索引将位于不同的HashSet中。重点是将ArrayList中所有相同字符串的索引放在同一个HashSet中,并将不同字符串中的索引放在不同的HashSet中。例如,程序应该打印[[0,1] [2,3]],但它会陷入无限循环。我放了一个print语句来验证前两个索引是否被添加到HashSet中,它们是什么。程序打印[[0,1]]而不是预期的结果。由于某种原因,list.get(index1).equals(list.get(index2))总是求值为true,即使我更新了循环中的索引,结果在第二次迭代时应为false。

package quiz;

import java.util.HashSet;
import java.util.ArrayList;
import java.util.Iterator;

public class Question {

public static void main(String[] args) {
    Question q = new Question();
    ArrayList<String> list2 = new ArrayList<String>();
    list2.add("a");
    list2.add("a");
    list2.add("c");
    list2.add("c");
    System.out.println(q.answer(list2));



}

public HashSet<HashSet<Integer>> answer(ArrayList<String> list){

    HashSet<HashSet<Integer>> hashSet = new HashSet<HashSet<Integer>>();
    HashSet<Integer> set = new HashSet<Integer>();

    Iterator<String> it = list.iterator();

        int index1 = 0;
        int index2 = 1;

        while (it.hasNext()){



            while (list.get(index1).equals(list.get(index2))){



                set.add(index1);
                set.add(index2);
                if (index1<list.size()-2){
                    index1=index1+1;
                    index2=index2+1;

                }

            }
            hashSet.add(set);
            System.out.println(hashSet);    
        }
        /*else{
            set.add(i);
        }*/



    return hashSet;
}
}

1 个答案:

答案 0 :(得分:1)

你得到一个无限循环因为你正在使用迭代器hasNext()但之后没有使用it.next()来向前移动索引。

此外,您并不真正需要迭代器,因为您没有使用这些值。你应该这样做:

while(shouldStop)
......
if (index1<list.size()-2){
   index1=index1+1;
   index2=index2+1;
} else {
   shouldStop=true
}
........