【问题标题】:Creating a Set of Arrays in java在java中创建一组数组
【发布时间】:2023-03-11 12:25:01
【问题描述】:

我想做类似的事情

Set <String[]> strSet = new HashSet <String[]> ();

有没有一种简单的方法可以在 Java 中创建一组数组,还是我必须编写自己的实现代码?将对象添加到 Set 使用 equals() 来检查对象,这不适用于数组。

【问题讨论】:

    标签: java arrays set


    【解决方案1】:

    数组不会覆盖equalshashCode,因此HashSet 将仅根据引用相等性比较它们。考虑改用Lists:

    Set<List<String>> strSet = new HashSet<List<String>>();
    

    来自List.equals 文档:

    返回true当且仅当指定的对象也是一个列表,两个列表的大小相同,并且两个列表中所有对应的元素对相等

    【讨论】:

    • Set 框架会自动调用这个 List.equals 来过滤重复的字符串列表还是我需要手动执行?
    • @jDub9 它应该会自动工作。由于多态性,Set 实现只需要知道调用equals,它是为所有对象声明的。 List 覆盖 equals 的合同以匹配引用的描述。
    【解决方案2】:

    使用Set&lt;List&lt;String&gt;&gt;。您可以根据需要使用Arrays.asListList.toArray 进行转换。

    【讨论】:

    • +1 用于提及Arrays.asList(这是支持数组的简单List 视图)。
    【解决方案3】:

    如果你真的需要Set&lt;String[]&gt;,没有简单而优雅的方法,AFAICT。问题在于,一方面,数组不会覆盖equals()hashCode()。另一方面,HashSet 类不提供将一些“策略”传递给它的可能性,这些“策略”将在外部实现哈希码和相等计算(类似于Comparator)。因此,您可以考虑使用自定义比较器创建 TreeSet。不幸的是,我不知道数组比较器的任何实现,所以很可能您需要自己编写。

    如果您可以拥有Set&lt;List&lt;String&gt;&gt;,您可以考虑其他答案中的建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-28
      • 2013-08-18
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多