映射不将值放在BigDecimal的键中,小数点后尾随零

时间:2017-05-02 05:51:40

标签: java hashmap bigdecimal

将值放入Map中的键中,而不是在键中添加值

public static void putKey(){
    TreeMap<BigDecimal,String> trmap = new TreeMap<BigDecimal,String>();
    MathContext mc = new MathContext(2);
    BigDecimal b1 = new BigDecimal(3.1,mc);
    BigDecimal b2 = new BigDecimal(3.10,mc);
    BigDecimal b3 = new BigDecimal(3.2,mc);
    BigDecimal b4 = new BigDecimal(3.3,mc);
    BigDecimal b5 = new BigDecimal(3.4,mc);

    trmap.put(b1, "3.1");
    trmap.put(b2, "3.10");
    trmap.put(b3, "3.2");
    trmap.put(b4, "3.3");
    trmap.put(b5, "3.4");

  System.out.println(trmap);
}
上面的地图3.10中的

没有添加到密钥中。

所以我试图计算两个值的哈希码

public static void putKey() {
    TreeMap<BigDecimal, String> trmap = new TreeMap<BigDecimal, String>();
    MathContext mc = new MathContext(2);
    BigDecimal b1 = new BigDecimal(3.1, mc);
    BigDecimal b2 = new BigDecimal(3.10, mc);
    BigDecimal b3 = new BigDecimal(3.2, mc);
    BigDecimal b4 = new BigDecimal(3.3, mc);
    BigDecimal b5 = new BigDecimal(3.4, mc);

    trmap.put(b1, "3.1");
    trmap.put(b2, "3.10");
    trmap.put(b3, "3.2");
    trmap.put(b4, "3.3");
    trmap.put(b5, "3.4");

    System.out.println(trmap);
    int hashcodeb1 = b1.hashCode();
    int hashcodeb2 = b2.hashCode();

    System.out.println("3.1-->" + hashcodeb1);
    System.out.println("3.10-->" + hashcodeb2);
}

两个哈希码都计算相同的值我的要求是我想把这两个值放在我的地图中,所以在其他论坛帖子的帮助下看起来我必须覆盖

  

hashCode()方法

方法,但它返回int作为值,我不确定它会对我的情况有帮助

我在班级中使用了hashCode()

public class BigDecimalMap {
    public BigDecimalMap() {
        super();
    }

    public static void main(String[] args) {
        BigDecimalMap bigDecimalMap = new BigDecimalMap();
        putKey();
        }

        public static void putKey() {
            TreeMap<BigDecimal, String> trmap = new TreeMap<BigDecimal, String>();
            MathContext mc = new MathContext(2);
            BigDecimal b1 = new BigDecimal(3.1, mc);
            BigDecimal b2 = new BigDecimal(3.10, mc);
            BigDecimal b3 = new BigDecimal(3.2, mc);
            BigDecimal b4 = new BigDecimal(3.3, mc);
            BigDecimal b5 = new BigDecimal(3.4, mc);

            trmap.put(b1, "3.1");
            trmap.put(b2, "3.10");
            trmap.put(b3, "3.2");
            trmap.put(b4, "3.3");
            trmap.put(b5, "3.4");

            System.out.println(trmap);
            int hashcodeb1 = b1.hashCode();
            int hashcodeb2 = b2.hashCode();

            System.out.println("3.1-->" + hashcodeb1);
            System.out.println("3.10-->" + hashcodeb2);
        }

        public int hashCode(){
            return 1;
        }
    }

帮助确定如何添加两个值

2 个答案:

答案 0 :(得分:2)

参考TreeMap的java文档

  

请注意,如果此有序映射要正确实现Map接口,则树映射维护的顺序(如任何已排序的映射,以及是否提供显式比较器)必须与equals一致。

由于BigDecimal的compareTo可能与equals不一致(compareTo可能返回0但等于返回false)。 使用HashMap代替hashCode和equals代码。

参考BigDecimal equals方法的java doc

  

将此BigDecimal与指定的Object进行相等性比较。与compareTo不同,此方法只考虑两个BigDecimal对象的值和比例相等(因此通过此方法比较时2.0不等于2.00)。

当我们执行以下代码时

MathContext mc = new MathContext(2);
BigDecimal b1 = new BigDecimal(3.1, mc);
BigDecimal b2 = new BigDecimal(3.10, mc);
System.out.println(b1.doubleValue());
System.out.println(b2.doubleValue());
System.out.println(b1.scale());
System.out.println(b2.scale());
System.out.println(b1.equals(b2));
System.out.println(b1.hashCode());
System.out.println(b2.hashCode());

由于b1和b2具有相同的值和比例,因此它们被认为是相同的对象。

为了区分这两个对象,使用带有String的构造函数而不是double(请参阅注释https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#BigDecimal(double))来设置不同的比例。

BigDecimal b1 = new BigDecimal("3.1");
BigDecimal b2 = new BigDecimal("3.10");
System.out.println(b1.doubleValue());
System.out.println(b2.doubleValue());
System.out.println(b1.scale());
System.out.println(b2.scale());
System.out.println(b1.equals(b2));
System.out.println(b1.hashCode());
System.out.println(b2.hashCode());

答案 1 :(得分:0)

Treemap被实现为红黑树;一个关注compareTo如何实施的问题,因为它必须将您的条目移至leftright

所以TreeMap只关心你的密钥如何实现compareTo方法。现在,如果你看一下这段代码:

    BigDecimal b1 = new BigDecimal("3.1");
    BigDecimal b2 = new BigDecimal("3.10");

    System.out.println(b1.compareTo(b2)); // this prints zero since
                        // they are the same according to compareTo

    TreeMap<BigDecimal, String> map = new TreeMap<>();
    map.put(b1, "aaa");
    map.put(b2, "bbb");

    System.out.println(map); // {3.1=bbb}

请注意,最后,在两次插入后,TreeMap中只有一个Entry。这是因为b1b2相同(根据compareTo),因此在第二次插入后,地图中的值会被替换。