gpt4 book ai didi

Java 8 流 - 按最大重复降序排序

转载 作者:搜寻专家 更新时间:2023-11-01 02:35:16 25 4
gpt4 key购买 nike

使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com