【问题标题】:How do I override the equals method of an array?如何覆盖数组的equals方法?
【发布时间】:2015-07-14 16:29:54
【问题描述】:

Set 和 List 之间的主要区别在于该集合不允许重复。所以我试图创建一个Set<Integer[]> 而不是List<Integer[]>,这样没有两个元素是相等的。但是当我阅读Set<Integer[]>

时,我得到了以下结果
[0, 4, 5]
[3, 4, 1]
[4, 5, 0]
[0, 3, 6]
[1, 3, 4]
[1, 2, 7]

对于我的实现,[0, 4, 5][4, 5, 0] 被认为是相等的。因此我的问题是:有没有办法覆盖 Integer[] 的 equals 方法,以便 set 函数的 add 方法可以避免同时承认 [0, 4, 5][4, 5, 0]

【问题讨论】:

  • 你为什么不使用Set<Set<Integer>> 或类似的?或者,Set<MyIntegerBag>?您是否因任何原因与Integer[] 绑定?
  • 不,你不能为数组覆盖equals
  • 有一个类似的问题,答案在:stackoverflow.com/questions/12292513/… 在那个例子中,他们使用了原始类型,但您可以使用采用 Object[] 数组的方法。
  • @nneonneo 非常感谢。我的大脑没有建立联系。你介意张贴作为回复,以便我可以给你这个线程的复选标记吗?谢谢。
  • 我可以添加一个响应,虽然看起来更好的响应已经出现

标签: java arrays set


【解决方案1】:

简短的回答:你不能。根本没有机制可以覆盖数组类中的任何内容。

相反,请考虑为您的对象使用替代容器。您可以为对象使用Set<Integer>,创建Set<Set<Integer>>,因为您似乎想要进行无序比较。

或者,为了更精细的控制,考虑使用您自己的类来包装数组或集合,并具有例如Set<MyIntegerBag>。然后您将完全控制所使用的比较操作。

【讨论】:

    【解决方案2】:

    不能覆盖数组中的任何方法。但是您并没有尝试覆盖数组中的方法,您真正想要做的是防止Set 中的重复。

    因此,正如@nneonneo 建议的那样,正确的做法是使用数组以外的东西。数组在本质上对它们的元素有秩序,这意味着你正在努力尝试使用Set<Integer[]>。您有三个更好的选择:

    1. 使用没有固有顺序的数据结构,例如HashSet
    2. 使用确实保留固有顺序的数据结构,例如TreeSetTreeMultiset in Guava
    3. 使用覆盖.equals() 比较的自定义对象,即wraps 数组。

    那么,在每种情况下,您的目标集将分别是 Set<Set<Integer>>Set<Multiset<Integer>>Set<MyWrapper>


    出于性能原因,我建议反对为您的Set 使用未排序数组的自定义Comparator。排序的数据结构可以在 O(n) Integer 比较中进行相等比较,但在幼稚的情况下,未排序的数据结构至少需要 O(n log n)。但是,如果您出于某种原因必须使用数组,则该解决方案将起作用。这就是我上面所说的“艰苦卓绝的战斗”。

    【讨论】:

    • 当您建议不要使用自定义 Comparator 时,我从上下文中猜测您隐含地引用了未排序数组的自定义比较器。
    【解决方案3】:

    将 java.util.TreeSet 与 Comparator 一起使用,对于您认为相等的两个数组返回零,否则遵循任何一致的排序规则。

    根据 TreeSet documentation,“TreeSet 实例使用它的 compareTo(或 compare)方法执行所有元素比较,因此从集合的角度来看,被此方法视为相等的两个元素是相等的。集合的行为是明确定义的,即使它的顺序与 equals 不一致;它只是不遵守 Set 接口的一般约定。"

    【讨论】:

      【解决方案4】:

      完全比较两个数组的一种方法是使用方法:

      Integer[]arrayOne, arrayTwo;
      //Arrays get set with contents, etc. 
      Arrays.equals(arrayOne, array2);
      

      equals 方法按顺序比较每个项目以及数组的大小。

      这来自一个类似的问题:How to overide equals for array in Java? 在该示例中,他们使用了采用原始数组类型的方法,但您可以使用采用 Object[] 的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 2020-01-30
        • 1970-01-01
        • 2015-02-25
        • 2012-08-30
        相关资源
        最近更新 更多