Java groupingBy()返回按升序排序的结果

Java groupingBy()返回按升序排序的结果,java,java-8,java-stream,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(

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

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)); 
List myData=new ArrayList();
Map myid=newlinkedhashmap();
试一试{
myData=myService.getData(id);
myid=myData.stream().collect(Collectors.groupingBy(myEntity::getDataId));
此处mydata按描述顺序排序,但在按组数据id创建集合后,我的列表将按升序排序。我希望我的集合列表按降序而不是升序排序。

collector(Collectors.groupingBy())
返回一个新的
映射
,该映射将变量覆盖到以前的
LinkedHashMap
。因此,您的初始赋值无效。返回的确切类型未由规范定义,但在我的测试运行中,它返回了一个
哈希映射
。(千万不要假设在不同版本和品牌的Java中总是如此!)

但主要问题是,您将
整数
存储为键。如果这些键的值小于
哈希映射
中表的模,它们将按顺序显示(因为
整数
哈希码
就是它的值).当我使用0..999的1000
Integer
值进行测试时,哈希表(作为
HashMap
内部工作的一部分的数组)的大小似乎为2048。(同样,未记录,因此不要假设它!)

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

如@Holger在中所述 ,Collectors.groupingBy()返回一个HashMap,它不保证顺序

以下是您可以做的:

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

将返回一个
LinkedHashMap
。由于收集器使用的列表是ArrayList,因此顺序也将保持不变。

您需要映射的相反顺序。因此在
Java8
中,我解决了这个问题

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);
myData=myService.getData(id);
myid=myData.stream().collect(Collectors.groupingBy(myEntity::getDataId));
Map finalMap=newlinkedhashmap();
myid.entrySet().stream()
.sorted(Map.Entry.comparingByKey()中)
.reversed())
.forEachOrdered(e->finalMap.put(e.getKey(),e.getValue());
System.out.println(“最终结果:+finalMap”);

Entryset
为我们提供了这个
myid
映射的
整数。因此排序和从第一个映射中获取
myid
放入
finalMap
收集器。groupingBy
返回一个
HashMap
,没有任何顺序(关于您看到的原因)“某些顺序”已解释)。正确的方法是指定在
收集器内保留顺序的
映射。groupingBy

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

))

请先反转列表。您能给我举个例子吗?
Collections.reverse(myData);
也许可以尝试
Collectors.groupingBy(myEntity::getDataId,LinkedHashMap::new,Collectors.toList())
@Hitobat你应该把这条评论作为答案发布,我认为这是解决问题的正确方法。哪个列表的顺序?但他现在说的是升序,但他想要降序。我解决了这个问题。我如何知道服务的回报,他可以排序我认为还是提供排序?我根据问题编写了这个代码。我对这个k进行排序eyset和map。它确实能正常工作,你能试试吗?我在问题中尝试了很多奇怪的东西,OP在文本上说我的数据是按desc顺序排序的,所以列表
mydata
已经按desc顺序排序了。问题是分组后,map不再排序。这是因为map是一个
HashMap
指令保留插入顺序的
LinkedHashMap的ad。
.sorted(Map.Entry.comparingByKey().reversed())
此行为我们提供排序感谢您提供的解决方案…我使用了上述代码,并按降序排列..但不知道在UI端它只按升序显示我正在使用ResponseEntity发送我的数据..所以您能帮我吗?谢谢again@FedericoPeraltaSchaffner哦!我的错,对不起我没抓住重点,我会告诉你的更新答案,tnx,因为它仍然没有抓住要点。您正在对列表进行排序,这些列表确实维护了遭遇顺序,但没有解决地图不维护顺序的实际问题。感谢您提供的解决方案,我使用了上面的代码,它以相反的顺序给了我集合,但在将数据发送到UI端后,它再次显示我n升序不知道出了什么问题我正在使用返回响应。ok(myidcollection)你能帮我一下吗this@sandy我不是版主,但我的理解是,根据这个网站的规则,你应该问一个单独的问题,链接到这个问题和答案。问题可能是在UI端,他们使用的是HashMap而不是LinkedHashMap,或者谁知道…我们需要更多的内容xt,这就是为什么我要你们问一个单独的问题。谢谢,我会问新问题