我正在尝试使用优秀的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;
}
}
答案 0 :(得分:1)
顶点已经具有由BitSet中设置的位定义的标识,因此您可以将BitSet
本身用于顶点。
边缘通常应该包含有关它开始和结束的顶点的信息,因此我建议Edge
类包含开始BitSet
,结束BitSet
和边{ {1}}。
如果两个顶点之间不存在两条边(即不允许边多重性),则可以在Letter
类中定义equals和hashcode,以测试开始和结束的相等性,忽略字母。如果边的字母很重要,因为你可能有多条边具有相同的起点和终点,你需要在节点之间保持适当的字母相等。