这里有一个基本问题:您希望同时测试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.