我有两个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
执行此程序时(无论如何将我带出循环,看看arraylist1
和arraylist2
如何比较){{1大多数时候(相应地)不同!然而,尽管如此,程序总是会遇到无限循环!
答案 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 )与List
和Set
的O(n)分别源于这样一个事实:它需要花费O(n)时间来判断element位于List
,只有O(1)来判断元素是否在Set
中。