char [] array = {a,a,a,b,b,c,c,c,a,d};
我想计算该数组中的每个相同元素,以便我可以从最高频率到最低频率进行排序。 我希望输出变成这样:
4 (for a)
2 (for b)
3 (for c)
1 (for d)
我试过这个
public static void CountbyChar(String s){
int [] arr = new int [s.length()];
char [] c =s.toCharArray();
for (int i=0;i<c.length;i++){
arr[i]=1;
for (int j=i+1;j<c.length;j++){
if(c[i]==c[j]){
arr[i]++;
}
}
}
for (int x:arr){
System.out.println(x);
}
}
但我得到了:
4
3
2
2
1
2
1
1
我的错在哪里?
答案 0 :(得分:3)
问题是您要为字符串中的每个字符创建一个新计数器,而不是为每个可能的字母创建一个。从本质上讲,您的程序会计算字符在当前字符之后的位置中出现的次数。
修复此问题应该相对容易:为字母表中的每个字母创建计数器,并在看到相应的字母时递增它们。假设你是区分大小写的,你可以这样做:
public static void CountbyChar(String s){
int [] arr = new int [256];
for (char c : s.toCharArray()){
if (c < 256) {
arr[c]++;
}
}
for (int i = 0 ; i != 256 ; i++) {
if (arr[i] != 0) {
System.out.print((char)i);
System.out.print(" : ");
System.out.println(arr[i]);
}
}
}
答案 1 :(得分:3)
以下是如何使用Map实现相同结果的简单示例:
char[] inputChars = { 'a', 'b', 'c', 'a', 'a', 'b', 'a', 'a' };
// create a map whose keys will be the chars in the array and
// whose values will represent the number of times each char
// occurs in the input array.
Map<Character, Integer> countMap = new HashMap<Character, Integer>();
// loop over the input array and populate the map
for (char c : inputChars) {
if (countMap.containsKey(c)) {
int currentCount = countMap.get(c);
countMap.put(c, currentCount + 1);
}
else {
countMap.put(c, 1);
}
}
// test it
for (char c : countMap.keySet()) {
print(c + ": " + countMap.get(c));
}
更多地图阅读:
答案 2 :(得分:1)
这是因为你要独立处理每个角色的位置 - 这意味着你只是在角色出现后才计算。
编辑:因为我被击败了,这是一个正确的例子:
public int[] charFrequency(String s) {
int[] frequencies = new int[256];
for (char c : s.toCharArray()) {
if (c > 0 && c < 256) {
frequencies[c]++;
}
}
return frequencies;
}
答案 3 :(得分:1)
您希望迭代数组并构建元素的映射,以便每个映射条目都是您遇到该键的次数的计数。因此,如果地图中不存在该键,请将其添加为计数1,否则使用该键的递增计数更新地图。
答案 4 :(得分:1)
你基本上为字符串中的每个字母都有一个计数器,你应该保留一个Map并累计每个字母的计数。
这样的事情就足够了
public static void CountbyChar(String s){
HashMap<Character, Integer> letterCountMap = new HashMap<Character, Integer> ();
char [] c =s.toCharArray();
for (int i=0;i<c.length;i++){
Integer count = 0;
if (letterCountMap.containsKey(c[i])){
count = letterCountMap.get(c[i]) + 1 ;
}else {
count = 1;
}
letterCountMap.put(c[i], count);
}
for (Map.Entry<String, String> entry : letterCountMap.entrySet())
{
System.out.println(entry.getValue() + "( for" + entry.getKey() + " )");
}
}
答案 5 :(得分:0)
以下是map的实现:
public static void countbyChar(String s){
Map<Character, Integer> map = new HashMap<Character,Integer>();
for (char c : s.toCharArray()){
Integer count = map.get(c);
if (count == null) {
map.put(c, 1);
}
else {
map.put(c, count + 1);
}
}
for (Map.Entry<Character, Integer> entry : map.entrySet())
{
System.out.println(entry.getKey().toString() + "/" + entry.getValue().toString());
}
}