TreeMap:使用随值移动的键对地图的值进行排序

时间:2010-01-27 09:55:20

标签: java data-structures

我有以下TreeMap:

TreeMap<Integer, Double> map;

Double值不是唯一的。

我使用Integer键和函数firstEntry()和higherEntry()遍历地图并修改Double值。

现在我想按照递减Double值的顺序列出对的值。 这样做的最佳方式是什么?

那些Integer键对我来说很重要,因为Double值不是唯一的,我不能有Double键。

更新: 更多解释 这是经典问题。让我们说学生的rollnos是关键,他们的百分比是价值。现在按百分比排序,然后我们应该能够分辨出它的百分比。因此我需要整数键。

3 个答案:

答案 0 :(得分:3)

显而易见的解决方案是获取双打的集合(可能通过entrySet然后getValue - TreeMap类有一个values()方法,您可以使用它,并继续对它们进行排序(使用Collections.sortArrays.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迭代条目。将它们放入列表中。然后用正确的比较器对日期排序。