所以,我正在为String压缩编写一个程序。如果输入是aabbccc
,输出应该是a2b2c3
。
但在我的程序中,我的输出是a2a2b2b2c3c3c3
。那是因为我的Print语句处于for循环中。哪个不应该在那里。
只有当String中的两个字符不相等时,如何才能执行print语句?这样我得到了正确的输出?
我已经尝试了其他方法来执行字符串压缩程序,但这种使用集合的方式对我来说似乎最简单。
public class Compress {
static int i;
static int freq;
public static void main(String args[]) {
System.out.println("Enter a String");
Scanner sc= new Scanner(System.in);
String str=sc.nextLine();
List<Character> arrlist = new ArrayList<Character>();
for(int i=0; i<str.length();i++){
arrlist.add(str.charAt(i));
}
for(int i=0; i<str.length();i++){
freq = Collections.frequency(arrlist, str.charAt(i));
System.out.print(str.charAt(i)+""+freq);
}
}
}
期望的结果
Input: aabbccc
Output: a2b2c3
我得到了什么
Input: aabbccc
Output: a2a2b2b2c3c3c3
您可以使用以下代码,不需要有2个嵌套循环来进行压缩。一个循环通过输入字符串就足够了。
class Compress {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter a string: ");
String inputString = scanner.nextLine();
scanner.close();
System.out.println("Compressed Input: " + compressInput(inputString));
}
private static String compressInput(String str) {
if(str.isEmpty())
return "";
if(str.length() == 1)
return str + "1";
StringBuilder result = new StringBuilder();
int cmpt = 1;
for (int i = 1; i < str.length(); i++) {
if(str.charAt(i - 1) == str.charAt(i))
cmpt++;
else {
result.append(str.charAt(i-1));
result.append(cmpt);
cmpt=1;
}
}
result.append(str.charAt(str.length()-1));
result.append(cmpt);
return result.toString();
}
}
输出示例:
Enter a string: aaabbbbccddddeeeefg
Compressed Input: a3b4c2d4e4f1g1
Collections.frequency
确实为您提供了输出中可以看到的计数,但问题是您需要按字符串中的每个字符进行分组。
利用地图:
Map<Character, Long> countMap = new HashMap<>();
for (int i = 0; i < inputString.length(); i++) {
countMap.merge(Character.valueOf(inputString.charAt(i)), 1L, (k, v) -> k + v);
}
countMap.forEach((k, v) -> System.out.print(k + "" + v));
您也可以采用与下面类似的方式进行操作。我已经使用了一个地图,其中关键是字符,值是出现的频率。
public class Compress {
static int i;
static int freq;
public static void main(String args[]) {
System.out.println("Enter a String");
Scanner sc = new Scanner(System.in);
HashMap<Character, Integer> hmap = new HashMap<>();
String str = sc.nextLine();
List<Character> arrlist = new ArrayList<Character>();
for (int i = 0; i < str.length(); i++) {
arrlist.add(str.charAt(i));
}
for (int i = 0; i < str.length(); i++) {
freq = Collections.frequency(arrlist, str.charAt(i));
hmap.put(str.charAt(i), freq);
}
for (Character c : hmap.keySet()) {
System.out.print(c + "" + hmap.get(c));
}
}
}