使用hashmap并使用treemap和降序的键值对其进行排序



我有此代码填充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)

您可能必须调整语法

最新更新