【问题标题】:How to sort two HashMaps having same keys but different values如何对具有相同键但不同值的两个HashMap进行排序
【发布时间】:2016-11-23 06:18:35
【问题描述】:

我有两个 HashMap:

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

其中“一”、“二”是属性。

我已经轻松地对第一张地图进行了排序,即map&lt;String,Integer&gt;。但是我怎样才能根据第一张地图对我的第二张地图进行排序,以便排序方法会返回一个如下所示的地图:

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

即按降序排列。

【问题讨论】:

  • 您是如何对HashMap 进行排序的?它们是无序的,所以这没有任何意义。您对 map1 的排序顺序是什么? Onethreetwo“降序”如何?在我看来,它们相当杂乱无章。
  • 基于键、值或不同的东西“根据第一张地图对我的第二张地图进行排序”是什么意思?

标签: java sorting collections hashmap


【解决方案1】:

不要使用 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);

同样,用&lt;String, Boolean&gt;创建第二个treeMap

【讨论】:

  • 如果您有任何疑问,请告诉我
  • 你告诉要对两个地图独立排序。但是我如何根据整数排序地图的地图对布尔地图进行排序。我不太清楚。
  • 这里的 Treemap 将根据键对映射进行排序。由于两个映射具有相同的键集,因此它们的排序顺序将相同。您不必按照 map1 对 map2 进行排序,您必须以相同的顺序单独对两个地图进行排序......这是由 tremap 比较器完成的
  • 你有什么困惑吗?
  • 我必须根据整数映射对布尔映射进行排序,因为这是整数映射按值的降序排序的需要,然后我将在布尔映射中进行相同的排序。我无法比较“字符串”键,即使两个地图中的键相同
【解决方案2】:

Maps 本质上是未排序的。第一张地图被排序的事实仅仅是偶然的。例如

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个对象,即从这个Comparatorcompare(o1, o2)方法返回的值是

func.apply(o1).compareTo(func.apply(o2))

map1::get 是对map1get 方法的方法引用。给定一个值o1,它将返回map1.get(o1)。结合这两个事实,因此创建的比较器的返回类型是

map1.get(o1).compareTo(map1.get(o2))

comparator.reversed() 只是返回一个Comparator 用于降序而不是升序的倒序。

【讨论】:

  • 你是如何使用比较(map::get)的。你能解释一下吗
  • @SukirtiShukla:添加了一些解释。如果您不熟悉方法引用,您可能需要阅读有关它们的 oracle 教程:docs.oracle.com/javase/tutorial/java/javaOO/…
猜你喜欢
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多