Java 如何通过键集对地图进行排序?

Java 如何通过键集对地图进行排序?,java,java-stream,Java,Java Stream,我想以一种不断增长的方式对地图的键集元素进行排序。 联接类型为innerJoin。 我有以下代码: Comparator<Tuple2<String, Integer>> comparator = Comparator.comparing((Function<Tuple2<String, Integer>, String>) Tuple2::get0).thenComparing(Tuple2::get1); Map<Tuple2<S

我想以一种不断增长的方式对地图的键集元素进行排序。 联接类型为innerJoin。 我有以下代码:

Comparator<Tuple2<String, Integer>> comparator = Comparator.comparing((Function<Tuple2<String, Integer>, String>) Tuple2::get0).thenComparing(Tuple2::get1);

Map<Tuple2<String, Integer>, LongSummaryStatistics> grouped = join.stream()
     .collect(groupingBy(t -> Tuples.of(t.get1().getCNation(), t.get4().getDYear()), () -> new TreeMap<>(comparator), summarizingLong(t->t.get0().getLoRevenue()-t.get0().getLoSupplycost())));

grouped.forEach((k, v) -> {
     System.out.format("%-32s, %,d%n", k, v.getSum());
});
我想得到这个结果:

Tuple2Impl {ARGENTINA, 1992}    , 9.671.947.837
Tuple2Impl {ARGENTINA, 1993}    , 10.047.205.160
Tuple2Impl {ARGENTINA, 1994}    , 10.141.821.441
Tuple2Impl {BRAZIL, 1992}       , 9.241.877.689
Tuple2Impl {BRAZIL, 1993}       , 9.057.962.411
Tuple2Impl {BRAZIL, 1994}       , 9.303.902.867
Tuple2Impl {CANADA, 1992}       , 9.746.312.266
Tuple2Impl {CANADA, 1993}       , 9.754.277.048
Tuple2Impl {CANADA, 1994}       , 10.069.331.565
...
Tuple2Impl {ARGENTINA, 1992}    , 9.671.947.837
Tuple2Impl {BRAZIL, 1992}       , 9.241.877.689
Tuple2Impl {CANADA, 1992}       , 9.746.312.266
Tuple2Impl {ARGENTINA, 1993}    , 10.047.205.160
Tuple2Impl {BRAZIL, 1993}       , 9.057.962.411
Tuple2Impl {CANADA, 1993}       , 9.754.277.048
Tuple2Impl {ARGENTINA, 1994}    , 10.141.821.441
Tuple2Impl {BRAZIL, 1994}       , 9.303.902.867
Tuple2Impl {CANADA, 1994}       , 10.069.331.565
...

看起来你想按年订购,然后按国家订购

Comparator<Tuple2<String, Integer>> comparator = 
    Comparator.comparing((Function<Tuple2<String, Integer>, Integer>) Tuple2::get1)
   .thenComparing(Tuple2::get0);
编辑
请注意,当代码使用get0然后get1时,我先使用get1然后使用get0。

您需要告诉比较器,您正在向树映射传递值,如果值相等,他需要按按键字符串排序什么是Tuple2以及联接的类型是什么?最好在Tuple2中实现Comparable,并通过所需的值进行比较。Comparator Comparator=Comparator.comparingFunction Tuple2::get0。然后比较Tuple2::get1@什么是比较器?是的,我想要这个。我已经有了这个代码,但是当值被映射时,它们的排序是不同的。不,这个解决方案是正确的。你的比较器和这个有区别。比较元组字段的顺序不正确:get0然后get1;正如这个解决方案正确指出的那样,它应该比较get1和get0。我已经切换到了这一点,但它的工作原理不同。它应该是这样的:Comparator Comparator=Comparator.comparingFunction Tuple2::get1.thenComparingTuple2::get0;谢谢,您可以将其简化为Comparator Comparator=Comparator.comparingTuple2::get1.Then comparingTuple2::get0;