这里我有打印单个字符数的代码,但我希望每个字符都出现次数。我的代码如下所示:
String s = "abdsd3$asda$asasdd$sadas";
int counter = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '$') {
counter++;
}
}
out.println("$ Occurence:" + counter + "times");`
我想要的输出是:a:7,b:1,d:6,s:6,$:3次。 有谁能够帮我?我们将非常感谢您的帮助。
答案 0 :(得分:0)
回想一下,字符是无符号整数类型(即数字),范围为0..65535。如果您知道所有字符都在0..127范围内,即第一组UNICODE代码点包括所有数字,两种情况下拉丁字母的字母以及许多常见的特殊字符,您可以创建一个计数器数组:
int[] counts = new int[128];
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch < 128) {
counts[ch]++;
} else {
System.err.println("Character is out of range: "+ch);
}
}
现在您可以按如下方式打印计数:
for (char c = 0 ; c < 128 ; c++) {
if (counts[i] != 0) {
System.out.println(c + " : " + counts[c]);
}
}
答案 1 :(得分:0)
首先,使用
对字符串中的字符进行排序char[] arr = s.toCharArray();
Arrays.sort(arr);
现在,当arr被排序时,只需执行您之前所做的计算,当位置i中的字符与arr [i-1]不同时,从零开始计数器:
public class CountChars {
public static void main(String[] args) {
String s = "abdsd3$asda$asasdd$sadas";
char[] arr = s.toCharArray();
java.util.Arrays.sort(arr);
int cnt = 0;
final char UNDEF = (char)-1;
char c = UNDEF, prev = UNDEF;
for(int i = 0; i<arr.length;++i){
c = arr[i];
if(c!=prev){
if(prev!=UNDEF){
System.out.println("The character '" +prev + "' occurs " + cnt +" times");
}
prev = c;
cnt = 1;
}else{
cnt++;
}
}
if(c!=UNDEF){
System.out.println("The character '" +c + "' occurs " + cnt +" times");
}
}
}
答案 2 :(得分:0)
public static void main(String[] args) {
LinkedHashMap<Character, Integer> h = new LinkedHashMap<>();
String s = "abdsd$asda$asasdd$sadas";
for (char ch : s.toCharArray()) {
if ((h.containsKey(ch))) {
h.put(ch, h.get(ch) + 1);
} else {
h.put(ch, 1);
}
}
for (char key : h.keySet()) {
System.out.println(key + "-" + h.get(key));
}
}
答案 3 :(得分:0)
使用流api的精美的一线解决方案:
Arrays.stream(new Scanner(System.in).nextLine().replace(" ", "").chars().mapToObj(c -> (char) c) //toCharArray returns primitive array
.toArray(Character[]::new))
.collect(Collectors.groupingByConcurrent(Function.identity(), Collectors.counting()))
.forEach((k, v) -> System.out.println(k + ", " + v));