java - 将逗号分隔的数字列表压缩到范围内

标签 java arrays java-8 range java-stream

我正在寻找一种巧妙的方法来执行以下操作:

获取数字列表:

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/

相关文章:

java - 需要帮助解释该程序的结果

java - 无法解析 Java 流中的方法 Character::hashCode

java - 无法创建用户 - 400 错误请求... Google 服务帐户

java - 从 .pfx 证书生成 BinarySecurityToken

java - 如何检索 Java 反射的子类?

javascript - 按值求和不同长度的对象数组

C编程数组大层次

java - 我如何解析带有德国变音符号的 XML!名字?

java - Instant vs LocalDateTime - 何时更喜欢其中一个

java - Java 8 与 Java 9 中的 Stream.peek() 方法