簡體   English   中英

Java程序無緣無故的無限循環?

[英]Java program having an infinite loop for no (?) reason

我有兩個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的改組,因此所有對應的ArrayList都將具有不同的元素)。 我也知道這不是計算時間。

我認為問題可能是 :我認為改組方法固有地存在“隨機性”,但是老實說,我不知道為什么這種方法不起作用。 實際上,當我在程序末尾使用代碼b=false進行此程序時(無論如何,讓我退出循環,並查看arraylist1arraylist2比較方式), ArrayList在大多數情況下(相應地)都是不同的! 盡管如此,程序始終會陷入無限循環!

似乎您想比較等效位置的字符串,而不是所有字符串-正如克里斯·海耶斯(Chris Hayes)所說,混洗不會阻止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++;
    }
  }
}
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 )。

ListSet的O(n 2 )vs O(n)分別來自以下事實:要花費O(n)的時間來判斷元素是否在List而只需要O(1)的時間來判斷元素是否在List中。 Set

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM