如何为循环图节点编写hashCode()函数?

 小宇宙 发布于 2023-02-09 10:45

我有以下用作图表一部分的类:

public class MyNode {

    private String name;

    private Set parents;

    private Set children;

    // getters and setters
}

当我使用Eclipse时Source / Generate hashCode() and equals(),它会生成以下方法:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((children == null) ? 0 : children.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    result = prime * result + ((parents == null) ? 0 : parents.hashCode());
    return result;
}

问题是这个方法从当前对象转到它的子节点,然后在计算第一个子节点的hashCode()时,它通过parents.hashCode()但是不知道hashCode()已经被计算回到原始节点那里.然后它重新进入children原始节点,它给出了一个美丽的无限循环.

问题:如何检查两个实例MyNode是同一个对象,同时避免无限循环?visited为了停止探索,在MyNode类中添加一个布尔值是否可以接受?或者有更好的解决方案吗?

谢谢!

1 个回答
  • 你不应该使用儿童或者执行时,节点的父母hashCodeequals.它们是可变的属性.hashCode更改边缘后计算将有所不同,将导致地图和集合集合损坏.

    仅实现hashCodeequals使用不可变字段,这些字段为对象创建不同的自然键.名称可能是一个很好的候选人,除非它可以改变.

    如果不存在不可变字段,则:

      不要覆盖hashCodeequals方法,默​​认会没问题.它将使每个类实例都是唯一的.

      制作一些独特的id字段(通过sequance)并将其用作种子hashCode和比较equals.

    2023-02-09 10:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有