轻松更改 Java 中 Collections 接口中的 .contains() 方法以断言平等

Posted

技术标签:

【中文标题】轻松更改 Java 中 Collections 接口中的 .contains() 方法以断言平等【英文标题】:Easily Change the .contains() method in the Collections interface in Java for Asserting Equality 【发布时间】:2020-08-09 02:33:35 【问题描述】:

我想知道是否有一种方法可以轻松修改 Java 中 List 接口中的“.contains()”方法,而无需创建自定义类。例如:

在 java 中处理数组集合时,.contains() 方法将始终返回 false,因为 .contains() 方法始终使用来自 Object 类的通用 .equals() 调用检查是否相等,该调用仅返回 true如果比较的对象在内存中具有相同的引用。但是,对于数组,对两个数组进行 Arrays.equals() 检查会更有用。

代码:

public class Temp 
    public static void main(String[] args) 
        int[] myIntArray = new int[] 1, 2, 3;
        List<int[]> myList = new ArrayList<>();
        myList.add(myIntArray);
        System.out.println(myList.contains(new int[] 1, 2, 3));
     // Output in the console: false
    // Preferred output: true

我知道可以通过使用 for 循环并使用 Arrays.equals() 方法迭代整个列表来相当容易地做到这一点,但我的目标是学习如何轻松雕刻 .contains( ) 方法转换为我需要的以供将来使用。非常感谢!

【问题讨论】:

寻找containsAll? 这能回答你的问题吗? Finding if an array contains all elements in another array @Naman 不完全是。如果我将一个整数列表与另一个进行比较,containAll 方法会很有用,但在这种情况下,我将比较一个 int[] 和一个 int[] 的列表。可以将每个 int[] 转换为 List 等价物,但如果我不必... 【参考方案1】:

没有。 contains() 只能使用 Object.equals,因为这是规范要求的。

这并不是说需要一个包含数组的概念是不合理的。只是你不能超载现有的概念。

你可以直接创建一个静态方法:

static <T> boolean containsArray(List<? extends T[]> list, T[] query) 
  return list.stream().anyMatch(e -> Arrays.equals(e, query));

然后在你会调用 list.contains(query) 的地方调用它。

这样做的好处是它适用于任何列表(带有引用类型的数组元素):您不必专门创建它,只需更新这些专门的比较。

(以上内容适用于任何引用类型的数组。您需要将其专门用于原始类型的数组)。

它还有一个好处是您不必处理Stephen C 强调的棘手后果(例如indexOfremove 等如何工作)。


还有另一种选择:使用“正确”支持等于的列表元素类型。例如,您可以使用Arrays.asList 包装数组以将它们存储在列表中,这样您就有了List&lt;List&lt;T&gt;&gt; 而不是List&lt;T[]&gt;

这将是一个相当侵入性的更改:它需要在整个代码中更改列表的类型;你没有提供任何关于你的数组列表的广泛使用的迹象。

【讨论】:

感谢您的回答!将其标记为最终响应。【参考方案2】:

我想知道是否有一种方法可以轻松修改Java中List接口中的contains方法,而无需创建自定义类。

没有办法。 List 的标准实现的 contains 方法的行为与 List API 指定的一样;即他们使用equals 方法。

另一方面,扩展 ArrayList 类并覆盖 contains 来做你想做的事情并不难。但如果你做得好,你需要考虑是否要:

indexOflastIndexOfcontains 保持一致 equals(Object) 的语义要与之保持一致 sublist(int, int) 返回的列表的语义与主列表的语义一致。

【讨论】:

感谢您的回答!

以上是关于轻松更改 Java 中 Collections 接口中的 .contains() 方法以断言平等的主要内容,如果未能解决你的问题,请参考以下文章

在 Ubuntu 中轻松更改 $JAVA_HOME [关闭]

在Ubuntu中轻松更改$ JAVA_HOME [关闭]

Java安全之Commons Collections3分析

Java中如何对集合排序

轻松掌握postman,愉快完成接口测试

当比较器返回0时,java 8中的Collections.sort不能用作java 6