0 java key-value comparator treeset
我当前有一个包含 Pair 类型元素的 TreeSet,并且我按其值降序对它们进行排序。
以下是原始 Pair 类文档的链接:https://docs.oracle.com/javase/9/docs/api/javafx/util/Pair.html
这是声明:
TreeSet<Pair<Integer, Integer>> sortedSet = new TreeSet<Pair<Integer, Integer>>((a,b) -> b.getValue() - a.getValue());
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我尝试在集合中插入几对,例如: Pair(4, 51)、Pair(8, 85)、Pair(1, 16)、Pair(2,51)、Pair( 2,51) 未插入。
插入对的代码:
sortedSet.add(new Pair<Integer, Integer>(4, 51));
sortedSet.add(new Pair<Integer, Integer>(8, 85));
sortedSet.add(new Pair<Integer, Integer>(1, 16));
sortedSet.add(new Pair<Integer, Integer>(2, 51));
Run Code Online (Sandbox Code Playgroud)
我设法找出原因是因为已经存在一个具有相同值的对元素 - P(4,51),但是,它们具有不同的键,因此它们是不同的元素,并且我期望 Pair(2,51)插入到 P(4,51) 之前或之后。
我有办法解决这个问题吗?
该问题是由以下定义引起的Comparator:
(a,b) -> b.getValue() - a.getValue()
Run Code Online (Sandbox Code Playgroud)
据此Comparator,两个Pair相同的 svalue是“相等”的。至于的契约Set,这意味着当且仅当 中不存在“等于”(相对于)的元素时,an 才会向 中add(...)添加一个元素。SetComparatorSet
如果我们想要存储两个Pair具有相同value但不同s 的keys,我们需要扩展 s Comparator,这样它就可以为具有相同但不同s 的 s 返回一个非0值。Pairvaluekey
一种可能性是:
value(降序 - 如原始代码中所示),并且key(升序或降序)下面的代码正是实现了这一点。是.reversed()的降序排序顺序value,我选择了升序排序顺序key:
final TreeSet<Pair<Integer, Integer>> sortedSet = new TreeSet<>(Comparator
.comparingInt(Pair<Integer, Integer>::getValue).reversed()
.thenComparing(Pair::getKey));
Run Code Online (Sandbox Code Playgroud)