Java 当.equals()可以';设置不正确吗?
我试图使用优秀的JGraphT库用Java编写一个Scrabble程序,作为有向无环图和Java的实践 所以,我的边是字母,顶点设置字母表的大小。基本上,您可以逐个字母遍历图形,并检查所处的位集,以查看如果将字母附加到从根节点开始的字母弧中,哪些字母构成单词 我明白了,但让我担心的是来自JGraphT Javadoc的这一点: 此方法使用此图形的EdgeFactory创建新边e。对于要添加的新边,e不得等于图中的任何其他边(即使图允许边的多重性)。更正式地说,图不能包含任何边e2,使得e2等于(e)。如果找到这样的e2,那么新创建的边e将被放弃,该方法将保持此图不变并返回null 我的边和节点永远不会是唯一的,除非引用不匹配。所以,我的问题是Java程序员会在这里做什么Java 当.equals()可以';设置不正确吗?,java,jgrapht,Java,Jgrapht,我试图使用优秀的JGraphT库用Java编写一个Scrabble程序,作为有向无环图和Java的实践 所以,我的边是字母,顶点设置字母表的大小。基本上,您可以逐个字母遍历图形,并检查所处的位集,以查看如果将字母附加到从根节点开始的字母弧中,哪些字母构成单词 我明白了,但让我担心的是来自JGraphT Javadoc的这一点: 此方法使用此图形的EdgeFactory创建新边e。对于要添加的新边,e不得等于图中的任何其他边(即使图允许边的多重性)。更正式地说,图不能包含任何边e2,使得e2等于(
- 创建一个字母类和一个位集类,并将equals()保留为默认值,该值将始终为false,因为引用不匹配?但是,那么我如何处理那些依赖于.equals()像.contains()一样正确的所有其他方法呢
- 在实字母和位集类周围创建Edge和Node类作为薄型包装,并将always false.equals()放在Edge中;节点和字母中的真实节点;比特集
public class Edge { private Letter letter; //getter and setter coming public boolean equals (Object b) { return false; } }
- 还有别的吗
位集本身
一条边通常应该包含关于它开始和结束的顶点的信息,因此我建议使用一个边类,该类包含开始位集
、结束位集
和边字母
如果两个顶点之间不存在两条边(即不允许边的多重性),则可以在edge
类中将equals和hashcode定义为测试起点和终点是否相等,忽略字母。如果一条边的字母很重要,因为可能有多条边具有相同的起点和终点,则节点之间的字母需要适当相等。顶点已经具有由位集中的位集定义的标识,因此可以对顶点使用位集本身
一条边通常应该包含关于它开始和结束的顶点的信息,因此我建议使用一个边类,该类包含开始位集
、结束位集
和边字母
如果两个顶点之间不存在两条边(即不允许边的多重性),则可以在edge
类中将equals和hashcode定义为测试起点和终点是否相等,忽略字母。如果一条边的字母很重要,因为可能有多条边具有相同的起点和终点,那么节点之间需要适当的字母相等。实际上,您可以为这两个类合理地实现相等。但是,由于您唯一需要的是确保每个对象都只等于它自己,而不是其他任何对象,因此默认的equals实现就可以做到这一点。所以不要覆盖它,实际上,您可以为这两个类合理地实现equals。但是,由于您唯一需要的是确保每个对象都只等于它自己,而不是其他任何对象,因此默认的equals实现就可以做到这一点。所以不要覆盖它这很有意义-我只在创建DAG的过程中存储最小数量的顶点,但是在相同的顶点之间会有多条边,所以我需要不禁止循环的非简单有向图,但这是可以管理的。然后,在将边添加到图形中后,我将边指向其开始和结束顶点。这很有意义-我只在创建DAG期间存储最小数量的顶点,但相同顶点之间会有多条边,因此我需要非简单有向图,它不禁止循环,但这是可管理的。然后,在将边添加到图形中后,我将边指向其起点和终点顶点。