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

如何为有限精度的double值编写正确的hashcode方法?

如何解决《如何为有限精度的double值编写正确的hashcode方法?》经验,为你挑选了1个好方法。

Foo如果double成员在另一个对象的给定范围内,则认为类的对象是相等的.由于浮点运算,可以容易地引入这样的错误.

该方法 isDoubleEqualsdoubleArrayEquals的部分相等,但合同规定哈希码必须是相等的对象相同的会照顾.双精度的默认哈希码不会将close值映射到相同的值,因此为匹配双精度数获取相同哈希值的好方法是什么?

public class Foo {

    double[] values;

    public Foo(double[] values) {
        this.values = values;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        //TODO Arrays.hashCode will not work with the contract
        result = prime * result + Arrays.hashCode(values);
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Foo other = (Foo) obj;
        if (!doubleArrayEquals(values, other.values,1e-10))
            return false;
        return true;
    }

    private boolean doubleArrayEquals(double[] arr, double[] arr2, double epsilon) {
        if (arr== arr2)
            return true;
        if (arr == null || arr2 == null)
            return false;

        int length = arr.length;
        if (arr2.length != length)
            return false;

        for(int i = 0; i 

Andy Turner.. 6

无法正确编写equalshashCode处理近似相等的方法.

equals要求及物性和近似平等的契约不具有传递性.

这并不是说近似相等不是一个有用的东西:它不是Java equals(和hashCode)方法的用途,因此你应该定义自己的方法 - 比如说isApproximatelyEqualTo- 来支持它,而不会重载着名的Java方法.



1> Andy Turner..:

无法正确编写equalshashCode处理近似相等的方法.

equals要求及物性和近似平等的契约不具有传递性.

这并不是说近似相等不是一个有用的东西:它不是Java equals(和hashCode)方法的用途,因此你应该定义自己的方法 - 比如说isApproximatelyEqualTo- 来支持它,而不会重载着名的Java方法.


推荐阅读
author-avatar
h619718610
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有