Collectors.groupingBy()返回以Java升序排序的结果

时间:2018-09-05 19:20:39

标签: java java-8 java-stream

我以降序发送结果,但输出以升序

List<myEntity> myData = new ArrayList<>();
Map<Integer,List<myEntity>> myid = new LinkedHashMap<>();

try {
    myData = myService.getData(id); 
    myid = myData.stream().collect(Collectors.groupingBy(myEntity::getDataId)); 

这里,mydata按desc顺序排序,但是在按组数据id创建集合后,我的列表按升序排序。我希望我的收藏夹列表是降序而不是升序。

4 个答案:

答案 0 :(得分:3)

collect(Collectors.groupingBy())返回一个新的Map,它将覆盖该变量为之前的LinkedHashMap。因此,您的最初任务是徒劳的。规格未定义返回的确切类型,但在我的测试运行中返回了HashMap。 (永远不要以为Java的不同版本和品牌都是这种情况!)

但是主要问题是您将Integer存储为密钥。如果这些键的值小于HashMap内表的模数,则它们将仅显示为有序(因为hashCode的{​​{1}}就是它的值)。当我使用1000 Integer的0..999值进行测试时,哈希表(作为Integer内部工作的一部分的数组)的大小似乎为2048。(再次,未记录,因此请不要承担吧!)

总之,您看到结果按升序排列的原因是由于实现工件,而不是因为特定的原因。

答案 1 :(得分:3)

Java 8 is not maintaining the order while grouping中所述的@Holger ,Collectors.groupingBy()返回一个HashMap,它不保证顺序。

这是您可以做的:

myid = myData.stream()
.collect(Collectors.groupingBy(MyEntity::getDataId,LinkedHashMap::new, toList()));

将返回LinkedHashMap<Integer, List<MyEntity>>。该顺序也将保持不变,因为收集器使用的列表是ArrayList。

答案 2 :(得分:1)

Collectors.groupingBy返回一个HashMap,但不带任何顺序(关于为什么您看到“某些顺序”的原因已得到解释,here)。正确的方法是指定Map,以保留Collectors.groupingBy内的顺序:

myData.stream()
      .collect(Collectors.groupingBy(
          MyEntity::getDataId,
          LinkedHashMap::new,
          Collectors.toList()     

))

答案 3 :(得分:0)

您需要地图的相反顺序。所以在java 8中,我解决了这个问题。

myData = myService.getData(id);
myid = myData.stream().collect(Collectors.groupingBy(myEntity::getDataId));

Map<Integer, List<myEntity>> finalMap = new LinkedHashMap<>();
myid.entrySet().stream()
        .sorted(Map.Entry.<Integer, List<myEntity>>comparingByKey()
                .reversed())
        .forEachOrdered(e -> finalMap.put(e.getKey(), e.getValue()));
System.out.println("FINAL RESULT : " + finalMap);

Entryset向我们Integers映射了myid。因此,从第一张地图(在myid

finalMap put 的第一张地图中排序获得