Java程序具有无限循环,没有(?)原因

时间:2013-12-02 00:53:07

标签: java debugging arraylist infinite-loop

我有两个ArrayList<ArrayList<String>>的大小相同。以下代码检查相应的ArrayList是否具有相同的元素。如果他们这样做,他们都被洗牌,程序重新检查并重复。

boolean b=true;
int counter=0;
while(b==true)
{
   for(int i=0; i<arraylist1.size(); i++)
   {
       for(int j=0; j<arraylist2.size(); j++)
       {
           for(String s1: arraylist1.get(i))
           {
               for(String s2: arraylist2.get(j))
               {
                  if(s1.equals(s2))
                  {
                     counter++;
                  }
               }      
           }
       }
   }

   if(counter==0)
   {
       b=false;
   }
   else
   {
       long random = System.nanoTime();
       Collections.shuffle(arraylist1, new Random(random));

       long random2 = System.nanoTime();
       Collections.shuffle(arraylist2, new Random(random2));

       counter=0;
   }           
}  

我知道问题不是:我知道不是两个ArrayList必须具有相同元素的对应ArrayList的情况(即,有一个ArrayList s的混乱,所有相应的ArrayList将具有不同的元素。我也知道这不是计算时间。

我认为问题可能是:我认为我所称的改组方法本质上是“非随机的”,但老实说,我不知道为什么这不起作用。事实上,当我在最后使用代码b=false执行此程序时(无论如何将我带出循环,看看arraylist1arraylist2如何比较){{1大多数时候(相应地)不同!然而,尽管如此,程序总是会遇到无限循环!

2 个答案:

答案 0 :(得分:1)

似乎你想要比较相等位置的弦,而不是所有弦 - 正如克里斯海耶斯所说,改组不会阻止s1和s2相等,它们只会处于不同的位置。听起来你需要做这样的事情:

for (int i = 0; i < arraylist1.size(); i++) {
  List<String> list1 = arraylist1.get(i);
  List<String> list2 = arraylist2.get(i);

  // Check if the two lists have any elements in common
  for (String s1 : list1) {
    if (list2.contains(s1)) {
      counter++;
    }
  }
}

答案 1 :(得分:0)

for(int i=0; i<listOfSets1.size(); i++){
    Set<String> set1 = new HashSet<String>(listOfSets1.get(i));
    Set<String> set2 = listOfSets2.get(i);

    // retainAll gives destructive intersection of set1 and set2
    if( !set1.retainAll(set2).isEmpty() )
        break;
}
// do something more than shuffle

而不是使用List<List<String>>使用List<Set<String>>。这将允许您在O(n)而不是O(n 2 )中进行两组的比较。

O {n 2 )与ListSet的O(n)分别源于这样一个事实:它需要花费O(n)时间来判断element位于List,只有O(1)来判断元素是否在Set中。