2

标题很好地说明了我遇到的麻烦,这是我的代码:

// fields required for traversal
private Queue<ArrayList<String>> q;
private ArrayList<ArrayList<String>> r;

Set<String> stringList = getMeStrings();
for(String s : stringList)
{
    ArrayList<String> stringsRoute = new ArrayList<String>();
    stringsRoute.add(getSomeString());
    stringsRoute.add(s);
    if(!r.contains(stringList))
    {
        if(!q.contains(stringList))
        {
            q.add(stringList);                          
        }
        r.add(stringList);
    }
}

我的 For 循环中的 If 语句总是失败,我认为原因是因为我正在创建一个新的 ArrayList 对象(不同的引用),而我的 If 语句没有检查 [ r ] 中每个 ArrayLists 的内容以相同的顺序包含相同的元素..等

我知道需要使用 .equals 来确定两个 ArrayList 是否相似,但我有一个包含许多其他 ArrayList 的 ArrayList。

如何检查父 ArrayList 是否包含等同于我正在创建的新 ArrayList 的 ArrayList?

我希望很清楚我想要达到的目标。

谢谢

4

2 回答 2

1

您需要遍历整体ArrayList,然后将每个元素ArrayList与ArrayList 类的StringsRouteusing方法进行比较。equals要实现 foreach 循环,您可以考虑获取ArrayList. 如果我们有ArrayList ar=new ArrayList();,我们可以用户ar.size()返回大小,然后简单地运行一个 for 循环ar.size()时间来迭代对应的每个元素ArrayList。希望这可以解决您的问题。

于 2013-01-23T14:15:22.273 回答
-1

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/AbstractList.html#equals%28java.lang.Object%29

对于要包含在 "r" 中的 "StringsRoute" , "r" 中必须有一个具有相同元素且顺序相同的列表。

Arrays.asList("1","2") .equals(Arrays.asList("2","1")) == false

Arrays.asList("1","2") .equals(Arrays.asList("1","2")) == true

Arrays.asList(Arrays.asList("1","2")).contains(Arrays.asList("1","2")) == true

Arrays.asList(Arrays.asList("1","2")).contains(Arrays.asList("2","1")) == false

可能是您想使用集合列表来避免与顺序斗争。

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/AbstractSet.html#equals%28java.lang.Object%29

List< Set< String > > r;

自从:

new HashSet(Arrays.asList("1","2")).equals(new HashSet(Arrays.asList("2","1"))) == true
于 2013-01-23T14:38:46.943 回答