我有此代码填充HashMap
并将其传递给TreeMap
以自然顺序在Key
值中对其进行排序。
Map<Integer, String[]> hashMap = new HashMap<Integer, String[]>();
hashMap.put(3, new String[]{"1","2"});
hashMap.put(2, new String[]{"1","2"});
hashMap.put(4, new String[]{"1","2"});
hashMap.put(1, new String[]{"1","2"});
System.out.println(hashMap);
Map<Integer, String[]> treeMap = new TreeMap<Integer, String[]>(hashMap);
System.out.println(hashMap); // Natural Order, Ascending
现在我的问题是,如何按Descending
顺序排序我的treeMap
?我已经准备了名为KeyComparator
的比较器类,将Key
排序为降序。这是我的代码:
public class KeyComparator implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 < o2) {
return 1;
} else if (o1 > o2) {
return -1;
} else {
return 0;
}
}
}
TreeMap
没有2个参数化的构造函数,例如TreeMap(new KeyComparator(),hashMap)
。我如何同时使用KeyComparator
类将hashMap
加载到我的treeMap
中。
像下面一样执行此操作,使用Comparator
创建一个treemap,然后使用 putAll
方法传递hashmap。
Map<Integer, String[]> treeMap = new TreeMap<Integer, String[]>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 < o2) {
return 1;
} else if (o1 > o2) {
return -1;
} else {
return 0;
}
}
});
treeMap.putAll(hashMap);
System.out.println(treeMap); // Descending
注意: - 在上面的示例中,我传递了Comparator
的匿名实现。您随时可以通过构造函数中的KeyComparator
传递。
虽然这可能无法回答您的问题,但为什么不简单地使用数组对其进行排序呢?
System.out.println("map: " + hashMap);
List<Integer> keys = new ArrayList<Integer>(hashMap.keySet());
System.out.println("unsorted keys: " + keys);
Collections.sort(keys);
System.out.println("sorted (asc) keys: " + keys);
Collections.reverse(keys);
System.out.println("sorted (desc) keys: " + keys);
如前所述,您需要首先将构造函数与键比较器(TreeMap(Comparator<? super K> comparator)
)一起使用,然后使用putAll(Map<? extends K,? extends V> m)
添加所有条目。
如果您使用 Java 8 无需重新实现它,只需使用Comparator.reverseOrder()
即可获取自然订购的反面接下来:
Map<Integer, String[]> treeMap = new TreeMap<>(Comparator.reverseOrder());
treeMap.putAll(hashMap);
System.out.println(treeMap);
TREEMAP对此有一个不错的方法。你可以做
TreeMap<Integer, String[]> map = new TreeMap<>(hashMap);
NavigleMap<Integer, String[]> reversedMap = map.descendingMap();
使用比较器首先创建一个空的treemap
Map<Integer, String[]> treeMap = new TreeMap<Integer, String[]>(new KeyComparator());
treeMap.putAll(hashMap);
http://docs.oracle.com/javase/7/docs/api/java/java/util/treemap.html#treemap(java.util.comparator)
您可能必须调整语法