热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在java中覆盖Triplet类的equals和hashcode

如何解决《在java中覆盖Triplet类的equals和hashcode》经验,为你挑选了1个好方法。

我有一个Triple类,它是一个可以包含3个整数(x,y,z)的类.我想覆盖equals/hashcode方法,以便它们可以在一个集合中使用.所以带(1,2,3)的obj应该等于(3,2,1)或(3,1,2),所以应该等于它的任何排列.我知道如何使用(x,y)对Pair类执行此操作 - 我对此的对类的代码是:

class Pair {
    int x;
    int y;

    public Pair(int x, int y) {
        this.x = x;
        this.y = y;
    }


    @Override
    public boolean equals(Object obj) {

        if(obj instanceof  Pair) {
            Pair p = (Pair) obj;

            if (this.x == p.x && p.y == this.y || this.x == p.y && this.y == p.x) {
                return true;
            }
        }

        return false;
    }

    @Override
    public int hashCode() {
        return Integer.hashCode(x) * Integer.hashCode(y);
    }
}

这工作正常,但如果我想将它扩展为Triple类,我知道我可以编辑equals方法并添加更多条件来检查,但这似乎很长.如果不在Java中使用外部库,我有什么方法可以做到这一点?



1> shmosel..:

一种解决方案是保留一个排序数组以进行比较:

class Triple {
    private final int x, y, z;
    private final int[] sorted;

    public Triple(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
        this.sorted = new int[] {x, y, z};
        Arrays.sort(sorted);
    }

    @Override
    public boolean equals(Object obj) {
        return obj instanceof Triple
                && Arrays.equals(((Triple)obj).sorted, this.sorted);
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(sorted);
    }
}


"如果OP要实现setX,setY,setZ方法",那么最好还是不要保持`Triple`不变
推荐阅读
author-avatar
安静2502917547
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有