压缩 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
请帮助编写下面的 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