Java 8 Map没有按值正确排序

时间:2018-03-29 15:37:45

标签: java sorting java-8 hashmap java-stream

我在这个网站上读过很多关于Java 8和Collections的问题,鉴于我对java流的理解有限,我在尝试对这个Map进行排序时遇到了一些麻烦。  我的代码如下,是tradeList和ArrayList();

Map<String, Double> buyReport = tradeList.stream().filter(trade -> trade.getInstruction() == Instruction.BUY)
                .sorted(Comparator.comparing(trade -> trade.getInstructionDate()))
                .collect(Collectors.groupingBy(trade -> dateFormat.format(trade.getInstructionDate()),
                        Collectors.summingDouble(trade -> trade.getUSDAmount())));

在编写HashMap时包含.sorted()语句是否有意义?我试图创建一个LinkedHashmap,使用自定义比较器为我需要对象实例进行比较(一个Double),但无济于事。

我可以包含您认为有用的任何其他代码。

提前致谢!!

更新:最近尝试了这个;在按公司代码分组然后总结公司总数时仍然无法获得结果:

Map<String, Double> entityOutgoingReport = tradeList.stream()
                .filter(trade -> trade.getInstruction() == Instruction.SELL)
                .collect(Collectors.groupingBy(trade -> String.valueOf(trade.getEntity()),
                        LinkedHashMap::new,
                        Collectors.summingDouble(trade -> trade.getUSDAmount())));

for (String entity : entityOutgoingReport.keySet()) {
            String key = entity;
            String value = decFormat.format(entityOutgoingReport.get(entity));
            tableBuilder.addRow(key, value); //Just pretty printing to console
        }

1 个答案:

答案 0 :(得分:0)

只需提供一个LinkedHashMap,其中将插入结果,从而维持秩序。

.collect(Collectors.groupingBy(trade -> 
       dateFormat.format(trade.getInstructionDate()),
                LinkedHashMap::new,
                    Collectors.summingDouble(trade -> trade.getUSDAmount())));

完整代码:

Map<String, Double> entityOutgoingReport = 
      tradeList.stream()
               .filter(trade -> trade.getInstruction() == Instruction.SELL)
               .sorted(Comparator.comparing(trade -> trade.getInstructionDate()))
               .collect(Collectors.groupingBy(trade -> String.valueOf(trade.getEntity()),
                        LinkedHashMap::new,
                        Collectors.summingDouble(trade -> trade.getUSDAmount())));