在Java中使用流对Map按值进行反向排序

rryofs0p  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(137)

我有一个TreeMap,看起来像这样:

{AMZ=12.733334, APL=10.133334, FBK=21.4, GGL=30.599998, GHB=4.6, MCS=11.433334}

**我想只保留包含3个最高值的条目。**我试着这样做:

TreeMap<String, Float> ThreeBestStocksMean = new TreeMap<>();
ThreeBestStocksMean = stocksMean.entrySet()
       .stream()
       .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
       .limit(3)
       .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (key1, key2) -> key1, TreeMap::new));
System.out.println(ThreeBestStocksMean.toString());

我得到这个:

{APL=10.133334, GHB=4.6, MCS=11.433334}

正如你所看到的,它与我想要的完全相反。它给了我3个最低的值,虽然我想要3个最高的。
我是否错误地使用了Comparator.reverseOrder()?事实上,它产生的结果与它不存在时完全相同。我也尝试使用Map.Entry.<String, Float>comparingByValue().reversed()获得相同的结果。

编辑:

上面的代码可以工作,我上面的代码中有一些剩余部分使它无法工作。

owfi6suc

owfi6suc1#

你能试着编译代码吗?我试着复制代码如下,我得到了预期的输出- {AMZ=12.733334,FBK=21.4,GGL=30.599998}

import java.util.*;
import java.util.stream.Collectors;

public class MyClass {
public static void main(String args[]) {
  TreeMap<String, Double> ThreeBestStocksMean = new TreeMap<>();
  TreeMap<String, Double> stocksMean = new TreeMap<>();
  stocksMean.put("AMZ",12.733334);
  stocksMean.put("APL",10.133334);
  stocksMean.put("FBK",21.4);
  stocksMean.put("GGL",30.599998);
  stocksMean.put("GHB",4.6);
  stocksMean.put("MCS",11.433334);

  ThreeBestStocksMean = stocksMean.entrySet()
   .stream()
   .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
   .limit(3)
   .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (key1, key2) -> key1, TreeMap::new));
   System.out.println(ThreeBestStocksMean.toString());
 }
}

相关问题