java比较器顺序_Java比较器:两个排序标准

这里有一个基本问题:您希望同时测试unicity和订购条目.没有内置集合可以同时检查条目是否相等以及它们的比较是0.

例如,两个Set实现是HashSet和TreeSet:

> HashSet使用Object的.equals()/.hashCode()来测试相等性;

> TreeSet使用比较器(或对象的可比较功能,如果它们实现它)来测试相等性.

这不是一回事.事实上,对于一个特定的JDK类,即BigDecimal,这可能会非常令人惊讶:

final BigDecimal one = new BigDecimal("1");

final BigDecimal oneDotZero = new BigDecimal("1.0");

final Set hashSet = new HashSet<>();

// BigDecimal implements Comparable of itself, so we can use that

final Set treeSet = new TreeSet<>();

hashSet.add(one);

hashSet.add(oneDotZero);

// hashSet's size is 2: one.equals(oneDotZero) == false

treeSet.add(one);

treeSet.add(oneDotZero);

// treeSet's size is... 1! one.compareTo(oneDotZero) == 0

你不能两个都吃蛋糕吃.在这里,你想根据年龄根据名称和比较来测试unicity,你必须使用Map.

要获得排序的人员列表,您必须将此映射的.values()副本作为列表并使用Collections.sort().如果你使用Guava,后一部分就像Ordering.natural().sortedCopy(theMap.values())一样简单,只要你的值实现Comparable.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值