2

次のようなマップがある場合:

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

Double 値を対応する Fruit オブジェクトにリンクしたまま、Double 値をソートする方法はありますか?

当初、私は次のようなことを考えていました:

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);
}

しかし、これを行うと、フルーツとダブル値の間のリンクが失われます...何かアイデアはありますか?

前もって感謝します

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 オブジェクトに関連付けられた double 値が 1 つだけあります。この場合、並べ替えは意味がありません。1 つの Fruit オブジェクトに複数の double 値が関連付けられている場合は、マップの構造を次のように変更します。

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

TreeSet を使用して、値をソートしておくことができます。

于 2013-03-19T15:47:02.167 に答える