我以降序发送结果,但输出以升序
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创建集合后,我的列表按升序排序。我希望我的收藏夹列表是降序而不是升序。
答案 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 的第一张地图中排序和获得)