轻松更改 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 强调的棘手后果(例如indexOf
、remove
等如何工作)。
还有另一种选择:使用“正确”支持等于的列表元素类型。例如,您可以使用Arrays.asList
包装数组以将它们存储在列表中,这样您就有了List<List<T>>
而不是List<T[]>
。
这将是一个相当侵入性的更改:它需要在整个代码中更改列表的类型;你没有提供任何关于你的数组列表的广泛使用的迹象。
【讨论】:
感谢您的回答!将其标记为最终响应。【参考方案2】:我想知道是否有一种方法可以轻松修改Java中
List
接口中的contains
方法,而无需创建自定义类。
没有办法。 List
的标准实现的 contains
方法的行为与 List
API 指定的一样;即他们使用equals
方法。
另一方面,扩展 ArrayList
类并覆盖 contains
来做你想做的事情并不难。但如果你做得好,你需要考虑是否要:
indexOf
和 lastIndexOf
与 contains
保持一致
equals(Object)
的语义要与之保持一致
sublist(int, int)
返回的列表的语义与主列表的语义一致。
【讨论】:
感谢您的回答!以上是关于轻松更改 Java 中 Collections 接口中的 .contains() 方法以断言平等的主要内容,如果未能解决你的问题,请参考以下文章