[英]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
進行此程序時(無論如何,讓我退出循環,並查看arraylist1
和arraylist2
比較方式), 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 )。
List
和Set
的O(n 2 )vs O(n)分別來自以下事實:要花費O(n)的時間來判斷元素是否在List
而只需要O(1)的時間來判斷元素是否在List
中。 Set
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.