首页 > 解决方案 > 在其连续出现之后返回每个字符

问题描述

我想在每个字符连续出现之后返回它
例如:

输入:GeeeEEKKKss
输出:1G3e2E3K2s

输入:ccccOddEEE
输出:4c1O2d3E

我已经开发了这段代码,它运行良好,但我正在寻找是否可以使用带有 lambda 表达式的 java 8 解决这个问题,或者是否有更好的解决方案。

 public static String encode(String plaintext ) {
    String str = "";    
    for (int i = 0; i < plaintext.length(); i++) {

        // Counting occurrences of s[i]
        int count = 1;
        while (i + 1 < plaintext.length()
                && plaintext.charAt(i)
                == plaintext.charAt(i + 1)) {
            i++;
            count++;
        }
        str += String.valueOf(count) + plaintext.charAt(i);
    }
    return str;
}

标签: javajava-stream

解决方案


这是一种使用正则表达式和 lambda 表达式的解决方案,但它需要 Java 9 或更高版本。

public static String encode(String plaintext) {
    return Pattern.compile("(.)\\1*").matcher(plaintext)
            .replaceAll(m -> m.group().length() + m.group(1));
}

对于完整的 Unicode 支持,包括。表情符号和字形簇,应该是:

public static String encode(String plaintext) {
    return Pattern.compile("(\\X)\\1*").matcher(plaintext)
            .replaceAll(m -> (m.end() - m.start()) / (m.end(1) - m.start(1)) + m.group(1));
}

推荐阅读