1

次のタイプのHashMapがあります。

HashMap<String, HashMap<String, Integer>>

このHashMapには次のような値があります

{name, {dateasString, numberOfTasks}} 

これをで並べ替えたいnumberOfTasks。私はそれをする方法を見つけることができません。

4

5 に答える 5

1

Comparatorオブジェクトの合計に従って要素を比較するカスタムを作成し、リスト/配列にデータを入力した後にArrays.sort()orを使用します。Collections.sort()

//populate example data:
final Map<String,Map<String,Integer>> map = new HashMap<String, Map<String,Integer>>();
map.put("x", new HashMap<String, Integer>());
map.get("x").put("t1",1);
map.get("x").put("t2",1);
map.get("x").put("t3",1);
map.put("y", new HashMap<String, Integer>());
map.get("y").put("t1",2);
map.get("y").put("t2",2);
map.get("y").put("t3",2);
map.put("z", new HashMap<String, Integer>());
map.get("z").put("t1",3);
map.get("z").put("t2",3);
map.get("z").put("t3",3);

//populate the data in a list:  
List<String> list = new ArrayList<String>(map.keySet());

//sort the data with a custom comparator:
Collections.sort(list, new Comparator<String>() {
    private int getSum(String s) { 
        int sum = 0;
        for (Integer x : map.get(s).values()) {
            if (x != null) sum += x;
        }
        return sum;
    }
    public int compare(String o1, String o2) {
        return new Integer(getSum(o1)).compareTo(new Integer(getSum(o2)));
    }
});

System.out.println(list);

パフォーマンスを向上させるために、キャッシングメカニズムを使用して、比較されるたびに各要素の合計を再計算することを避けることができることに注意してください。

于 2013-01-23T09:55:28.703 に答える
1

2 番目HashMapは である必要がありHashMapますか? HashMap2番目をこれ専用のクラスに変換できますか? おそらく次のようなものです:

private class TaskList
{
    String dateAsString;
    int numTasks;
    public TaskList(String dateAsString, int numTasks)
    {
        this.dateAsString = dateAsString;
        this.numTasks = numTasks;
    }
    public getDateAsString()
    {
        return dateAsString;
    }
    public getNumTasks()
    {
        return numTasks;
    }
}

HashMap<String, TaskList>次に、タスクの数を直接言ってアクセスし、それに応じて並べ替えることができます。HashMapそれでも、これは適切ではないと思います。

于 2013-01-23T09:56:57.100 に答える
1

をソートすることはできませんHashMapが、ソートされたキーの配列 (またはリスト) を取得できます。ソートをどのように定義するかはあなた次第です - コンパレーター (またはnumberOfTasksそれが呼び出す関数) を変更するだけです:)

それで、このようなものは?

public static void main() {
    final
    HashMap<String, HashMap<String, Integer>> map = new HashMap<String, HashMap<String, Integer>>();

    String[] keys = (String[]) map.keySet().toArray();

    Arrays.sort(keys, new Comparator<String>() {
        @Override
        public int compare(String k1, String k2) {
            int v1 = numberOfTasks(map.get(k1));
            int v2 = numberOfTasks(map.get(k2));
            return Integer.valueOf(v1).compareTo(Integer.valueOf(v2));
        }
    });

    // 'keys' is now sorted the way you want.

}

public static int numberOfTasks(HashMap<String, Integer> map) {
    int max = 0;
    for (Integer i : map.values()) {
        if (i > max) max = i;
    }
    return max;
}
于 2013-01-23T09:57:51.513 に答える
0

JavaAPIでこれを行う方法があるとは思えません。別のモデルでデータを抽出して並べ替えることで手動で行うか、そのフィールドでの並べ替えが簡単になるようにモデルを再設計する必要があります。

于 2013-01-23T09:42:55.433 に答える
0

ハッシュマップを配列に変換する必要があります。ハッシュマップを並べ替えることができれば、そもそもハッシュマップを使用する目的が完全に無効になります。

hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values

Arrays.sort(array); // sorts an array

それが役立つことを願っています。

于 2013-01-23T09:49:57.707 に答える