次のタイプのHashMapがあります。
HashMap<String, HashMap<String, Integer>>
このHashMapには次のような値があります
{name, {dateasString, numberOfTasks}}
これをで並べ替えたいnumberOfTasks
。私はそれをする方法を見つけることができません。
次のタイプのHashMapがあります。
HashMap<String, HashMap<String, Integer>>
このHashMapには次のような値があります
{name, {dateasString, numberOfTasks}}
これをで並べ替えたいnumberOfTasks
。私はそれをする方法を見つけることができません。
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);
パフォーマンスを向上させるために、キャッシングメカニズムを使用して、比較されるたびに各要素の合計を再計算することを避けることができることに注意してください。
2 番目HashMap
は である必要がありHashMap
ますか? HashMap
2番目をこれ専用のクラスに変換できますか? おそらく次のようなものです:
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
それでも、これは適切ではないと思います。
をソートすることはできません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;
}
JavaAPIでこれを行う方法があるとは思えません。別のモデルでデータを抽出して並べ替えることで手動で行うか、そのフィールドでの並べ替えが簡単になるようにモデルを再設計する必要があります。
ハッシュマップを配列に変換する必要があります。ハッシュマップを並べ替えることができれば、そもそもハッシュマップを使用する目的が完全に無効になります。
hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values
Arrays.sort(array); // sorts an array
それが役立つことを願っています。