【问题标题】:What to do when .equals() can't be set correctly?.equals() 设置不正确怎么办?
【发布时间】:2011-06-27 02:04:40
【问题描述】:

我正在尝试使用优秀的 JGraphT 库在 Java 中编写拼字游戏程序,作为有向无环图和 Java 的练习。

所以,我的边将是字母,顶点位设置字母的大小。本质上,您逐个字母地遍历图形并检查您所在的位集,以查看如果附加到您从根节点遵循的字母弧中,哪些字母构成了一个单词。

我明白了,但让我担心的是来自 JGraphT Javadoc:

此方法使用此图的 EdgeFactory 创建新边 e。对于要添加的新边,e 不能等于图形中的任何其他边(即使图形允许边多重性)。更正式地说,该图不得包含任何边 e2 使得 e2.equals(e)。如果找到这样的 e2 则放弃新创建的边 e,该方法保持此图不变返回 null。

我的边和节点永远不会是唯一的,除非引用不匹配。所以,我的问题是 Java 程序员会在这里做什么?

  • 创建一个 Letter 类和一个 BitSet 类并将 equals() 保留为默认值,这将始终为 false,因为引用不匹配?但是,那么我该如何处理所有其他依赖 .equals() 正确的方法,例如 .contains()?

  • 创建 Edge 和 Node 类作为真正的 Letter 和 BitSet 类的薄包装器,并将始终为 false 的 .equals() 放在 Edge;Node 中,将真实的放在 Letter;Bitset 中?

    public class Edge {
      private Letter letter;
      //getter and setter coming
      public boolean equals (Object b) {
        return false;
      }
    }
    
  • 还有别的吗?

【问题讨论】:

  • 你实际上可以为这两个类合理地实现equals。但是,由于您唯一需要的是确保每个对象都只等于它自己而不是任何其他对象,因此默认的 equals 实现将做到这一点。所以不要覆盖它

标签: java jgrapht


【解决方案1】:

顶点已经具有由 BitSet 中设置的位定义的标识,因此您可以将 BitSet 本身用于顶点。

一条边通常应该携带关于它开始和结束的顶点的信息,所以我建议一个 Edge 类,它包含开始 BitSet、结束 BitSet 和边 Letter

如果两个顶点之间不存在两条边(即不允许边多重性),那么您可以在 Edge 类中定义 equals 和 hashcode 来测试开始和结束的相等性,忽略字母。如果一条边的字母很重要,因为您可能有多个具有相同起点和终点的边,您需要在节点之间适当地字母相等。

【讨论】:

  • 这很有意义 - 我只在创建 DAG 期间存储最少数量的顶点,但相同顶点之间会有多个边,所以我需要非简单有向图不禁止循环,但这是可以管理的。然后,在将边缘添加到图形后,我将它们指向它的开始和结束顶点。
猜你喜欢
  • 2012-05-04
  • 2014-08-09
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
相关资源
最近更新 更多