按价值排序地图?

时间:2013-03-19 15:31:56

标签: java

如果我有这样的地图:

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值之间的联系...任何想法?

提前致谢

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

您无法根据值维护地图条目(键,值)的顺序,但可以基于TreeMap<k,v>的键来维护。

  

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

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

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

它将停止不必要的迭代。

答案 2 :(得分:1)

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

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

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