1

我正在尝试使用优秀的 JGraphT 库在 Java 中编写一个 Scrabble 程序,作为有向无环图和 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;
      }
    }
    
  • 还有什么?
4

1 回答 1

1

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

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

If no two edges exist between two vertices (i.e. edge-multiplicity is disallowed), then you can define equals and hashcode in the Edge class as testing for equality of start and end, ignoring the letter. If the letter of an edge is important because you might have multiple edges with equal start and end, you need a proper equality of letters between nodes.

于 2011-06-26T17:58:01.233 回答