如果我有这样的地图:
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值之间的联系...任何想法?
提前致谢
答案 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来保持值的排序。