我正在寻找一种巧妙的方法来执行以下操作:
获取数字列表:
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
最佳答案
既然我们已经看到了几种 Stream 变体,这里将非 Stream 变体进行比较:
private static StringBuilder appendRange(StringBuilder sb, int start, int previous) {
sb.append(start);
if(start!=previous) sb.append(previous-start>1? " - ": ", ").append(previous);
return sb;
}
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 12, 13, 14, 19);
StringBuilder sb = new StringBuilder();
int previous = list.get(0), start = previous;
for(int next: list.subList(1, list.size())) {
if(previous+1 != next) {
appendRange(sb, start, previous).append(", ");
start = next;
}
previous = next;
}
String result = appendRange(sb, start, previous).toString();
关于java - 将逗号分隔的数字列表压缩到范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45321012/