用java压缩字符串

pbgvytdp  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(331)

请帮助使用下面的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;
        }
    }
}
2vuwiymt

2vuwiymt1#

问题来自 str.charAt(i) + (char)count ,因为它们是2个字符,所以用它们的 int 价值观,
通过使用连续的 append() 电话

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

您可以通过使用外部 for-loop 三元运算符 append ,仅增量 i 在内部 while 通过保存 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));
}
qnakjoqk

qnakjoqk2#

你的主要问题是 StringBuilder 输入我在这个例子中显示的值。但在这个例子中,我使用正则表达式。 (.) 是匹配任何字符的捕获块 \\1* 指第一个捕获块,后跟0个或多个相同字符。
下面的代码为输入的文本构造匹配器,然后继续查找后续匹配项。它们可以打印出来作为发现或放置在 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

相关问题