【问题标题】:check if List<int[]> contains a given int[] [duplicate]检查 List<int[]> 是否包含给定的 int[] [重复]
【发布时间】:2020-03-06 00:26:18
【问题描述】:

如何检查 ArrayList&lt;int[]&gt; 是否包含给定数组 [x, y]?我找到了the same question in c#,但找不到 java 的任何答案。

目前我正在使用myList.contains(myArray),但它总是评估为假,我假设与 C# 中的原因类似。 C#中的解决方案是使用LINQ,在java中是没有的。

是否有其他方法可以做到这一点,或者我必须编写自己的子程序来提取每个列表元素的值并手动比较它们?


编辑:我已经编写了自己的子程序来执行此操作(假设每个数组都有两个元素),但更优雅的解决方案将不胜感激

private boolean contains(List<int[]> list, int[] array) {
    for (int[] listItem : list) {
        if (listItem[0] == array[0] &&
           listItem[1] == array[1]) {
            return true;
        }
    }
    return false;

【问题讨论】:

  • 备注:由于泛型是不变的和可擦除的,而数组是协变的和保留的,混合它们会给你带来麻烦。

标签: java arraylist


【解决方案1】:

.contains 方法将每个对象与.equals 进行比较,this 回答指出,它只是比较数组对象的身份(即检查它们是否是同一个 Java 对象),它不比较内容数组。

你需要做的是编写一个for循环,用Arrays.equals(..)检查每个元素(比较数组的内容)。例如:

boolean found = false;
for (int i = 0; i < myList.size(); i++)
    if (Arrays.equals(myArray, myList.get(i)) found = true;

【讨论】:

    【解决方案2】:

    Arrays.equalsStreams,它们是为与 LINQ 类似的用例而设计的。在这种情况下,Stream.anyMatch 方法与 LINQ 中的Any 非常相似。

    结合这两者,您可以在一个语句中编写您的方法:

    private boolean contains(List<int[]> list, int[] array) {
        return list.stream()
            .anyMatch(x -> Arrays.equals(x, array));
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-05
      • 2015-11-21
      • 2012-08-14
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 2011-06-26
      • 2013-10-17
      • 2014-03-25
      相关资源
      最近更新 更多