【问题标题】:Creating Comparator for TreeSet with 2D Arrays - Java使用 2D 数组为 TreeSet 创建比较器 - Java
【发布时间】:2012-03-09 19:27:23
【问题描述】:

在我的 Java 程序中,我有一个包含 2D 数组的 TreeSet。但是,我不希望其中有任何重复项,因此我决定创建一个实现 Comparator 的类,以便使用 TreeSet 的 contains() 方法,看看我是否添加了重复项。但是,contains() 有时似乎无法正常工作。这是比较器:

public class ComparatorMatrix implements Comparator<int[][]> {

public int compare(int[][] matrix1, int[][] matrix2) {
    if(Arrays.deepEquals(matrix1, matrix2)) {return 0;}

    return -1;
}

我没有实现 equals() 方法,也不知道该怎么做。我该怎么办?

【问题讨论】:

  • 如果项目更小或更大,比较器应该返回负值或正值;你的永远不会返回正值。如果 a a。你需要让它自洽。它不能只返回 0 来表示相等;你需要妥善处理剩下的事情。
  • 为什么是 TreeSet 而不是常规集?然后你可以只定义相等/哈希码,而不用担心矩阵是“小于”还是“大于”另一个 matirx
  • TreeSet 对于 contains() 操作具有 log(n) 复杂性。我需要它尽可能快。

标签: java arrays comparator treeset implements


【解决方案1】:

ComparatorMatrix 不满足 Comparator 的定义,这就是您遇到问题的原因。正如 Carl Manaster 所说,如果 compare(a,b) 返回 -1,您需要正确返回 compare(b,a) 必须返回 1,否则它将在 TreeSet 中不起作用。

如果没有定义排序,那么您必须使用另一个 HashSet。那么,你只需要实现hashCode和equals; equals 已经实现。您可以轻松地将矩阵包装在缓存 hashCode 的对象中,因此您不必每次都重新计算它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    相关资源
    最近更新 更多