当.equals()无法正确设置时该怎么办?

时间:2011-06-26 17:28:42

标签: java jgrapht

我正在尝试使用优秀的JGraphT库来编写Java中的Scrabble程序作为实践,使用有向非循环图和Java。

所以,我的边缘将是字母,顶点位设置为字母表的大小。基本上,你逐个字母地遍历图形,并检查你所在的位集,看看如果附加到你从根节点跟随的字母弧上,哪些字母形成一个单词。

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

  

此方法使用此图形的EdgeFactory创建新边e。对于要添加的新边缘,e必须不等于图形的任何其他边缘(即使图形允许边缘多重性)。更正式地说,图形不得包含e2.equals(e)的任何边e2。如果找到这样的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;
      }
    }
    
  • 别的什么?

1 个答案:

答案 0 :(得分:1)

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

边缘通常应该包含有关它开始和结束的顶点的信息,因此我建议Edge类包含开始BitSet,结束BitSet和边{ {1}}。

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