使用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);
}
Map.Entry
实例的列表;它只显示了文本输出。此外,您可以像.sorted(Map.Entry.comparingByValue(Comparator.comparingInt(List<?>::size).reversed()))
这样简化比较器。 - HolgerList<?>::size
,但会编译List<String>::size
。 - EugenesplitAsStream
方法复杂且代价高昂。我会使用类似Pattern p = Pattern.compile("(.*?)\\s:\\s(.*)", Pattern.DOTALL);
和.map(CompatibilityRule::getGroupName).map(p::matcher).filter(Matcher::find).collect(Collectors.groupingBy(m -> m.group(1), Collectors.mapping(m -> m.group(2), Collectors.toList())))
的方法。 - HolgerPattern.DOTALL
。 - Eugene