【问题标题】:How to check if ArrayList<ArrayList<String>> contains a certain ArrayList<String>如何检查 ArrayList<ArrayList<String>> 是否包含某个 ArrayList<String>
【发布时间】:2013-01-23 14:09:58
【问题描述】:

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

// 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 语句没有检查是否每个 ArrayLists 的内容[ r ] 以相同的顺序包含相同的元素..等

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

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

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

谢谢

【问题讨论】:

  • 请不要以大写开头的变量名...StringsRoute 看起来像一个类而不是一个变量!
  • 你知道stringsRoute总是包含2个元素吗?
  • 感谢您指出 jlordo,我稍后需要更改它,但现在我只是在为主要问题找到一个巧妙的解决方案。再次感谢。
  • @Ciwan:嗯,现在的方式(总是 2 个字符串)我会引入一个类 StringTuple 并为此提供一个 equals 方法并使用 List&lt;StringTuple&gt; 而不是 @987654327 @.
  • @Ciwan...如果您的arraylist r 不包含arrayList stringList,您是否知道您将进入if 循环?如果主arraylist r 中存在stringList arraylist,您的if 循环将始终失败.

标签: java arraylist equals


【解决方案1】:

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

【讨论】:

  • 那么一个foreach循环?我对那些很糟糕。 :( 我知道怎么用文字表达,但不会编码!>> foreach ArrayList in r,看看它是否等于给定的ArrayList。如果它们中的任何一个相等,请将一些bool设置为true?
【解决方案2】:

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

要让 "StringsRoute" 包含在 "r" 中,"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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2013-07-02
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2016-01-13
    相关资源
    最近更新 更多