我正在寻找一种执行以下操作的聪明方法:
列出数字:
1、2、3、4、5、12、13、14、19
然后将其压缩为一个字符串,如下所示:
1-5、12-14、19
使用以下规则:仅当范围内的数字计数为3或更大时,才压缩到范围内(即使用破折号)。
即:1、2、4、5将导致:1、2、4、5,而不是:1-2、4-5
最佳答案
我只能考虑一个自定义的收集器...显然,可以创建一个返回该收集器的方法,并且在这种情况下,如果该收集器是通过静态工厂方法隐藏的,则该代码将非常紧凑。
注意combiner
基本上什么都不做,对于并行编码不好。我仍在尝试为它提供实现的好方法。
List<String> result = IntStream.of(1, 2, 3, 4, 5, 12, 13, 14, 19)
.boxed()
.collect(Collector.of(
() -> {
List<List<Integer>> list = new ArrayList<>();
list.add(new ArrayList<>());
return list;
},
(list, x) -> {
List<Integer> inner = list.get(list.size() - 1);
if (inner.size() == 0) {
inner.add(x);
} else {
int lastElement = inner.get(inner.size() - 1);
if (lastElement == x - 1) {
inner.add(x);
} else {
List<Integer> oneMore = new ArrayList<>();
oneMore.add(x);
list.add(oneMore);
}
}
},
(left, right) -> {
throw new IllegalArgumentException("No parallel!");
},
list -> {
return list.stream()
.map(inner -> {
if (inner.size() > 1) {
return inner.get(0) + "-" + inner.get(inner.size() - 1);
}
return "" + inner.get(0);
}).collect(Collectors.toList());
}));
System.out.println(result);
关于java - 将逗号分隔的数字列表压缩到范围内,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45321012/