我有以下TreeMap:
TreeMap<Integer, Double> map;
Double值不是唯一的。
我使用Integer键和函数firstEntry()和higherEntry()遍历地图并修改Double值。
现在我想按照递减Double值的顺序列出对的值。 这样做的最佳方式是什么?
那些Integer键对我来说很重要,因为Double值不是唯一的,我不能有Double键。
更新: 更多解释 这是经典问题。让我们说学生的rollnos是关键,他们的百分比是价值。现在按百分比排序,然后我们应该能够分辨出它的百分比。因此我需要整数键。
答案 0 :(得分:3)
显而易见的解决方案是获取双打的集合(可能通过 - TreeMap类有一个entrySet
然后getValue
values()
方法,您可以使用它,并继续对它们进行排序(使用Collections.sort
或Arrays.sort
) - 但是,这将花费O(n logn)时间。
我不确定你能否以更智能(==更快)的方式做到这一点,除非你完全改变数据结构。但是,我在另一个数据结构中看到这种情况的唯一方法是在整数和双精度上保留一个包装器并写入两个比较器 - 一个比较integer
和一个比较double
的比较器。 }然后由integer
。您正在使用的原始TreeMap将是相同的,但您可以从中分离另一个TreeMap,按第二个比较器排序。分离仍然需要O(n logn)时间。
答案 1 :(得分:1)
你可以建立一个TreeSet
,保证插入顺序:
@Test
public void treeMapSortedByValue() {
// given the following map:
TreeMap<Integer, Double> map = new TreeMap<Integer, Double>();
map.put(2, Math.E);
map.put(1, Math.PI);
map.put(3, 42.0);
// build a TreeSet of entries
Set<Map.Entry<Integer, Double>> sortedEntries = new TreeSet<Map.Entry<Integer, Double>>(new DoubleComparator());
sortedEntries.addAll(map.entrySet());
// optionally you can build a List<Double> with the sorted
List<Double> doubles = new LinkedList<Double>();
for (Map.Entry<Integer, Double> entry : sortedEntries) {
doubles.add(entry.getValue());
}
}
这应该给你:[2.718281828459045, 3.141592653589793, 42.0]
(nb:[Math.E, Math.PI, Math.UNIVERSAL_ANSWER]
:-)。
<强> PS 强>
Comparator
:
class DoubleComparator implements Comparator<Map.Entry<Integer, Double>> {
@Override
public int compare(Entry<Integer, Double> o1, Entry<Integer, Double> o2) {
return Double.compare(o1.getValue(), o2.getValue());
}
}
答案 2 :(得分:0)
您可以执行以下操作:使用entrySet迭代条目。将它们放入列表中。然后用正确的比较器对日期排序。