Java 当.equals()可以';设置不正确吗?

Java 当.equals()可以';设置不正确吗?,java,jgrapht,Java,Jgrapht,我试图使用优秀的JGraphT库用Java编写一个Scrabble程序,作为有向无环图和Java的实践 所以,我的边是字母,顶点设置字母表的大小。基本上,您可以逐个字母遍历图形,并检查所处的位集,以查看如果将字母附加到从根节点开始的字母弧中,哪些字母构成单词 我明白了,但让我担心的是来自JGraphT Javadoc的这一点: 此方法使用此图形的EdgeFactory创建新边e。对于要添加的新边,e不得等于图中的任何其他边(即使图允许边的多重性)。更正式地说,图不能包含任何边e2,使得e2等于(

我试图使用优秀的JGraphT库用Java编写一个Scrabble程序,作为有向无环图和Java的实践

所以,我的边是字母,顶点设置字母表的大小。基本上,您可以逐个字母遍历图形,并检查所处的位集,以查看如果将字母附加到从根节点开始的字母弧中,哪些字母构成单词

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

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

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

  • 创建一个字母类和一个位集类,并将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期间存储最小数量的顶点,但相同顶点之间会有多条边,因此我需要非简单有向图,它不禁止循环,但这是可管理的。然后,在将边添加到图形中后,我将边指向其起点和终点顶点。