gpt4 book ai didi

java - TreeMap 将 BigDecimal 键放在小数点后尾随零没有效果

转载 作者:行者123 更新时间:2023-11-30 02:33:23 26 4
gpt4 key购买 nike

将值放入 M​​ap 中的键中,而不是在键中添加值

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中没有添加key。

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

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);
}

两个哈希代码都计算相同的值,我的要求是我想将这两个值都放入我的 map 中,因此在其他论坛帖子的帮助下,看起来我必须覆盖 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;
}
}

请帮助确定如何添加这两个值。

最佳答案

请参阅 TreeMap 的 Javadoc

Note that the ordering maintained by a tree map, like any sorted map, and whether or not an explicit comparator is provided, must be consistent with equals if this sorted map is to correctly implement the Map interface.

由于BigDecimalcompareToequals不一致(compareTo可能返回0但equals返回false)。使用 HashMap 代替,考虑 hashCodeequals 作为键。

请参阅 BigDecimal#equals 的 Javadoc方法

Compares this BigDecimal with the specified Object for equality. Unlike compareTo, this method considers two BigDecimal objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by this method).

当我们执行以下代码时

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.compareTo(b2));
System.out.println(b1.equals(b2));
System.out.println(b1.hashCode());
System.out.println(b2.hashCode());

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

然后我们用下面的代码比较不同比例的b1和b2。为了创建不同比例的 BigDeciaml,请使用 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.compareTo(b2));
System.out.println(b1.equals(b2));
System.out.println(b1.hashCode());
System.out.println(b2.hashCode());

关于java - TreeMap 将 BigDecimal 键放在小数点后尾随零没有效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43730977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com