使用HashMap并使用具有降序键值的TreeMap对其进行排序

时间:2016-11-29 11:20:07

标签: java sorting collections comparator

我有这段代码填充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

现在我的问题是,如何在treeMap订单中对Descending进行排序?我已经准备好了名为KeyComparator的Comparator类,它将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

5 个答案:

答案 0 :(得分:2)

如下所示,使用Comparator创建一个树形图,然后使用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

答案 1 :(得分:1)

虽然这可能无法解答您的问题,但为什么不简单地使用数组对其进行排序?

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

答案 2 :(得分:1)

如前所述,首先需要使用带有密钥比较器的构造函数TreeMap(Comparator<? super K> comparator),然后使用putAll(Map<? extends K,? extends V> m)添加所有条目。

如果您使用 Java 8 ,则无需重新实现它,只需使用Comparator.reverseOrder()即可获得自然排序的反向:

UPDATE Table_A
    SET Table_A.email_address = (SELECT Table_B.email_address
                                 FROM Table_B 
                                 WHERE Table_A.member_id = Table_B.member_id
                                )
    WHERE (SELECT 1 FROM Table_B WHERE Table_A.member_id = Table_B.member_id);

答案 3 :(得分:0)

TreeMap有一个不错的方法。你可以做到

 TreeMap<Integer, String[]> map = new TreeMap<>(hashMap);
 NavigleMap<Integer, String[]> reversedMap = map.descendingMap();

答案 4 :(得分:0)

首先使用比较器创建一个空的TreeMap

Map<Integer, String[]> treeMap = new TreeMap<Integer, String[]>(new KeyComparator());

treeMap.putAll(hashMap);

http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html#TreeMap(java.util.Comparator)

您可能需要调整语法