【发布时间】:2023-03-11 12:25:01
【问题描述】:
我想做类似的事情
Set <String[]> strSet = new HashSet <String[]> ();
有没有一种简单的方法可以在 Java 中创建一组数组,还是我必须编写自己的实现代码?将对象添加到 Set 使用 equals() 来检查对象,这不适用于数组。
【问题讨论】:
我想做类似的事情
Set <String[]> strSet = new HashSet <String[]> ();
有没有一种简单的方法可以在 Java 中创建一组数组,还是我必须编写自己的实现代码?将对象添加到 Set 使用 equals() 来检查对象,这不适用于数组。
【问题讨论】:
数组不会覆盖equals 和hashCode,因此HashSet 将仅根据引用相等性比较它们。考虑改用Lists:
Set<List<String>> strSet = new HashSet<List<String>>();
来自List.equals 文档:
返回
true当且仅当指定的对象也是一个列表,两个列表的大小相同,并且两个列表中所有对应的元素对相等。
【讨论】:
Set 实现只需要知道调用equals,它是为所有对象声明的。 List 覆盖 equals 的合同以匹配引用的描述。
使用Set<List<String>>。您可以根据需要使用Arrays.asList 和List.toArray 进行转换。
【讨论】:
Arrays.asList(这是支持数组的简单List 视图)。
如果你真的需要Set<String[]>,没有简单而优雅的方法,AFAICT。问题在于,一方面,数组不会覆盖equals() 和hashCode()。另一方面,HashSet 类不提供将一些“策略”传递给它的可能性,这些“策略”将在外部实现哈希码和相等计算(类似于Comparator)。因此,您可以考虑使用自定义比较器创建 TreeSet。不幸的是,我不知道数组比较器的任何实现,所以很可能您需要自己编写。
如果您可以拥有Set<List<String>>,您可以考虑其他答案中的建议。
【讨论】: