2

如果我有这样的地图:

Map<Fruit, Double> multiMap = new HashMap<Fruit, Double>();

有没有办法让我对 Double 值进行排序,同时仍然保持 Double 值链接到相应的 Fruit 对象?

最初我正在考虑做这样的事情:

public ArrayList<Double> sortAllValues() {
    ArrayList<Double> allEntries = new ArrayList<Double>();

    for (Entry<Fruit, Double> entry : multiMap.entrySet())
        allEntries.add(entry.getValue());
    }
return Collections.sort(allEntries);
}

但如果我这样做,我会失去 Fruit 和 Double 值之间的联系......有什么想法吗?

提前致谢

4

3 回答 3

2

考虑以下:

class ValuedFruit implements Comparable<ValuedFruit> {
    private Fruit fruit;
    private double value;

    @Override
    public int compareTo(ValuedFruit o) {
        return (value < o.value) ? -1 : ((value > o.value) ? 1 : 0);
    }
}
List<ValuedFruit> fruits = new ArrayList<ValuedFruit>();
void sort(List<ValuedFruit> fruits){
    Collections.sort(fruits);
}
于 2013-03-19T15:55:04.570 回答
1

您不可能根据值维护映射条目(键,值)的顺序,但可以基于带有 的键TreeMap<k,v>

TreeMap 是根据其键的自然顺序排序的,或者是在地图创建时提供的 Comparator 排序的,具体取决于使用的构造函数。此实现为 containsKey、get、put 和 remove 操作提供有保证的 log(n) 时间成本。

你可以做的是更新你的代码 -

public ArrayList<Double> sortAllValues() {    
     return Collections.sort(multiMap.values());
}

它将停止不必要的迭代。

于 2013-03-19T15:38:41.157 回答
1

您只有与每个 Fruit 对象关联的单个双精度值。如果是这种情况,那么排序没有任何意义。如果您有多个与单个 Fruit 对象关联的双精度值,则将地图的结构更改为如下所示:

Map<Fruit, Set<Double>> multiMap = new HashMap<Fruit, Set<Double>>();

您可以使用 TreeSet 来保持值排序。

于 2013-03-19T15:47:02.167 回答