作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
使用 Java 8 流,我正在尝试按字段(组名)最大重复项降序的一部分对列表进行排序。
之前只需要使用第一部分:第二部分不相关。与唯一行记录顺序无关。(我只是想根据最大重复数将重复记录放在首位。)
测试数据:
100 : 200
200 : 207
200 : 203
200 : 201
300 : 202
103 : 201
103 : 202
预期:
200 : 207
200 : 203
200 : 201
103 : 201
103 : 202
100 : 200
300 : 202
我试过下面的代码,它正确地返回了订单。但只有分组数据而不是原始的完整记录和排序。
200=3
103=2
100=1
300=1
Java代码
@Test
public void testSplit2Optimsation() {
List<CompatibilityRule> rules = new ArrayList<>();
CompatibilityRule compatibilityRule1 = new CompatibilityRule();
compatibilityRule1.setGroupname("100 : 200");
CompatibilityRule compatibilityRule2 = new CompatibilityRule();
compatibilityRule2.setGroupname("200 : 207");
CompatibilityRule compatibilityRule3 = new CompatibilityRule();
compatibilityRule3.setGroupname("200 : 203");
CompatibilityRule compatibilityRule4 = new CompatibilityRule();
compatibilityRule4.setGroupname("200 : 201");
CompatibilityRule compatibilityRule5 = new CompatibilityRule();
compatibilityRule5.setGroupname("300 : 202");
CompatibilityRule compatibilityRule6 = new CompatibilityRule();
compatibilityRule6.setGroupname("102 : 202");
CompatibilityRule compatibilityRule7 = new CompatibilityRule();
compatibilityRule7.setGroupname("103 : 202");
rules.add(compatibilityRule1);
rules.add(compatibilityRule2);
rules.add(compatibilityRule3);
rules.add(compatibilityRule4);
rules.add(compatibilityRule5);
rules.add(compatibilityRule6);
rules.add(compatibilityRule7);
rules.stream()
.map(r -> r.getGroupname().split(":")[0].trim())
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.sorted(Map.Entry.<String, Long>comparingByValue().reversed())
.forEach(System.out::println);
}
最佳答案
有趣的是,您的输入数据与 Java 代码中的实际示例不一致,并且您已经接受并回答了不以您想要的格式打印信息的问题:在您的代码中,您想要条目,接受的答案做一个 List
...
但无论如何,考虑到你的字面问题,一旦你做了 .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())
你就“失去”了第二个groupName
的一部分,因为之前的 map
。您可以为此使用 Collectors::mapping
:
Pattern p = Pattern.compile("\\s:\\s");
rules.stream()
.map(CompatibilityRule::getGroupName)
.collect(Collectors.groupingBy(
x -> p.splitAsStream(x)
.findFirst()
.orElseThrow(),
Collectors.mapping(
x -> p.splitAsStream(x).skip(1).findFirst().orElseThrow(),
Collectors.toList())
))
.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Comparator.comparingInt(List<String>::size).reversed()))
.flatMap(x -> x.getValue().stream()
.map(y -> new SimpleEntry<>(x.getKey(), y)))
.forEachOrdered(System.out::println);
关于Java 8 流 - 按最大重复降序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57496241/
我是一名优秀的程序员,十分优秀!