如何对具有相同键但值不同的两个HashMaps进行排序

时间:2016-07-20 06:41:00

标签: java sorting collections hashmap

我有两个HashMaps:

Map<String,Integer> map1 = {"One"= 1245598 , "two" = 0 ,"three" =1};
Map<String,Boolean> map2 = {"One" =true , "two" =false ,"three" = true};

其中&#34;一个&#34; &#34; 2&#34;是属性。

我已轻松排序了第一张地图map<String,Integer>。但是如何根据第一张地图对第二张地图进行排序,这样sort方法会返回一张如下所示的地图:

map2= {"One" =true , "three" = true ,"two" = false};

即。按降序排列。

2 个答案:

答案 0 :(得分:1)

Map本来就是未分类的。第一张地图的排序事实只是偶然的。 E.g。

Map<String, Integer> map1 = new HashMap<>();
map1.put("Four", 4);
map1.put("One", 1245598);
map1.put("two", 0);
map1.put("three", 1);
map1.put("Six", 6);

将导致

map1={Six=6, Four=4, One=1245598, two=0, three=1}

要获取有序地图,您需要使用特殊的地图类型,例如TreeMap。您可以为TreeMap指定比较器,该比较器允许您根据第一张地图的值对第二个Map进行排序。

Map<String, Integer> map1 = new TreeMap<>();
map1.put("One", 1245598);
map1.put("two", 0);
map1.put("three", 1);

Map<String,Boolean> map2 = new TreeMap<>(Comparator.comparing(map1::get).reversed());
map2.put("One",true);
map2.put("two", false);
map2.put("three", true);

System.out.println("map1="+map1);
System.out.println("map2="+map2);

输出:

map1={One=1245598, three=1, two=0}
map2={One=true, three=true, two=false}

但请注意,第一张地图的更新可能会破坏第二张地图。

Comparator.comparing(map1::get).reversed()

只是在java 8中创建比较器的简短方法:

Comparator.comparing(func)

创建Comparator,通过比较将func应用于这些对象的结果来比较2个对象,即从compare(o1, o2)的{​​{1}}方法返回的值为< / p>

Comparator

func.apply(o1).compareTo(func.apply(o2)) map1::get get方法的方法参考。给定值map1,它将返回o1。结合这两个事实,因此创建的比较器的返回类型是

map1.get(o1)

map1.get(o1).compareTo(map1.get(o2)) 只返回comparator.reversed()的逆序,而不是升序排序。

答案 1 :(得分:0)

而不是使用HashMap使用TreeMap。这将对您的地图进行排序。

您可以参考以下链接:LINK 1link 2

Map<String, Integer> treeMap1 = new TreeMap<String, Integer>(
            new Comparator<String>() {

            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);
            }

        });
        treeMap1.putAll(map1);

同样,使用<String, Boolean>

创建第二个treeMap