对HashMap及其嵌套的HashMap进行排序

时间:2017-06-28 22:35:01

标签: java sorting hashmap

我正在尝试对嵌套的hashMaps进行排序,其中两个HashMaps都需要排序。

第一个hashMap应按键排序。第二个应按值排序。 到目前为止,我设法通过创建一个键数组并对其进行排序来对第一个hashMap的键进行排序。

我的hashmap看起来像这样

 HashMap<String,HashMap<String,Integer>> carOwners = new 
                                    HashMap<String,HashMap<String, Integer>>();

一个例子就是说我们有第一个String是Name,汽车品牌,qnty。

实施例: 大卫:

奥迪→5

宝马→4

Izabel:

VW大于10

MB→4

所以基本上首先我们对名称进行排序,然后按值对嵌套哈希进行排序。如何做到这一点......无法找到任何有用的信息:(&gt;

2 个答案:

答案 0 :(得分:3)

要对Map进行排序,您可以使用以下类:TreeMap。正如official documentation所说,

  

地图根据其键的自然顺序或地图创建时提供的比较器进行排序,具体取决于使用的构造函数。

如果要对广告订单中的元素进行排序,请使用LinkedHashMap

  

此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。

按值排序Map,请参阅此post。它也适用于Java7和Java8。

希望它有所帮助。

答案 1 :(得分:3)

将第一个地图设为TreeMap,将第二个地图设为值,按值排序。请参阅此post

以下是您问题的代码段。

public static void main(String[] args) {
    Map<String, HashMap<String, Integer>> carOwners = new TreeMap<String, HashMap<String, Integer>>();
    HashMap<String, Integer> nameQuantity = new HashMap<String, Integer>();
    nameQuantity.put("Audi", 5);
    nameQuantity.put("BMW", 4);
    carOwners.put("David", sortByValue(nameQuantity)); 
    nameQuantity = new HashMap<String, Integer>();
    nameQuantity.put("VW", 10);
    nameQuantity.put("MB", 4);
    carOwners.put("Izabel", sortByValue(nameQuantity)); 
    for (Map.Entry<String, HashMap<String, Integer>> carOwnerEntry : carOwners.entrySet()) {
        System.out.println(carOwnerEntry.getKey());
        HashMap<String, Integer> nameQty = carOwnerEntry.getValue();
        for (Map.Entry<String, Integer> nameQtyEntry : nameQty.entrySet()) {
            System.out.println(nameQtyEntry.getKey() + " " + nameQtyEntry.getValue());
        }
    }

public static <K, V extends Comparable<? super V>> HashMap<K, V> sortByValue(Map<K, V> map) {
    List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>(map.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<K, V>>() {
        public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) {
            return (o1.getValue()).compareTo(o2.getValue());
        });
    HashMap<K, V> result = new LinkedHashMap<K, V>();
    for (Map.Entry<K, V> entry : list) {
        result.put(entry.getKey(), entry.getValue());
    }
    return result;
}
相关问题