压缩 java 中的字符串

Compress the string in java

请帮助编写下面的 java 代码。
当我提供输入时,例如 aabbcccd, 输出是 99100102d,但它应该是 a2b2c3d。 谁能告诉我这段代码中的错误是什么? (此代码尝试捕获输入和输出输入特定字符的频率)

import java.util.*;

public class Main {

    public static void main(String args[]) {
        try {
            Scanner scn = new Scanner(System.in);
            String s = scn.nextLine();                     // taking input
            StringBuilder str = new StringBuilder(s);              
            StringBuilder str_new = new StringBuilder();

            int i = 0 ;
            while (i < str.length()) {
                int count = 1; 
                while (i < str.length()-1 && str.charAt(i) == str.charAt(i+1)){
                    count += 1;
                    i++;
                }
                if (count == 1)
                    str_new.append(str.charAt(i));
                else
                    str_new.append(str.charAt(i) + (char)count);
                i++;
            }
            System.out.println(str_new);
        } catch (Exception e) {
            return;
        }
    }
}

问题来自 str.charAt(i) + (char)count,因为它们是 2 个字符,所以它们用它们的 int 值求和,


通过使用连续的 append() 调用解决这个问题

str_new.append(str.charAt(i)).append(count);

您可以通过在 append 中使用外部 for-loop 和三元运算符来减少代码,并通过保存 while 仅增加内部 i i之前

int count;
for (int i = 0; i < str.length(); i++) {
    count = i;
    while (i < str.length() - 1 && str.charAt(i) == str.charAt(i + 1)) {
        i++;
    }
    str_new.append(str.charAt(i)).append((i - count) == 0 ? "" : (i - count + 1));
}

您的主要问题是使用 StringBuilder 并输入我在此示例中显示的值。但在这种情况下,我使用的是正则表达式。

  • (.) 是匹配任何字符的捕获块
  • \1*指的是第一个捕获块后跟0个或多个相同的字符。

下面的代码为输入的文本构造Matcher,然后继续寻找后续的匹配项。它们可以按找到的方式打印出来,也可以按照我的选择放在 StringBuilder 中。

Scanner scn = new Scanner(System.in);
String text = scn.nextLine();

Matcher m = Pattern.compile("(.)\1*").matcher(text);

StringBuilder sb = new StringBuilder();
while (m.find()) {
    String s = m.group();
    int count = s.length();
    sb.append(s.charAt(0)).append(count > 1 ? count : "");
}

System.out.println(sb.toString());

用于 aaabbbbcadb 打印

a3b4cadb