如何检查字符在数组中的显示次数?

时间:2015-01-11 12:51:52

标签: java arrays

我正在尝试创建一个程序,告诉我一个字母出现在数组中的次数,所以如果数组包含{'a','c','b','a','b','a'},它将输出:
a: 3
c: 1
b: 2
我正在构建这个程序,所以我可以学习如何思考,所以我只想用基础知识来做。没有Hashmap和其他更高级的东西。

编辑:这是我的答案,我成功创建了没有 Hashmap的程序:

public class arrays5 {

    public static void main(String[] args) {
    char [] arr = {'a', 'b', 'a', 'c', 'b','a'};
    char [] letters = new char[arr.length];

    int count = 0;
    char ch = '_';
    boolean isInArray;

    for (int i=0; i < arr.length; i++) {
        isInArray = false;
        for (int j = 0; j < arr.length; j++) {
            if (arr[i] == letters[j])
                isInArray = true;
        }

        if (!isInArray)
            letters[i] = arr[i];
    }

    int amountOfLetters = 0;
    for (int i = 0; i < letters.length; i++) {
        if (letters[i] != '\0')
            amountOfLetters++;
    }

    int index = 0;

    char [] newLetters = new char[amountOfLetters];
    for (int i = 0; i < letters.length; i++) {
        if (letters[i] != '\0') {
            newLetters[index] = letters[i];
            index++;
        }
    }

    for (int k = 0; k < newLetters.length; k++) {
        for(int i=0;i<arr.length;i++){
            ch = arr[i];
            count = 0;
            for(int j=i;j<arr.length;j++){
                if(arr[i] == arr[j])
                    count++;
            }

            if (ch == newLetters[k])
                System.out.println(ch + ": " + count);
        }

    }

  }
}

我创建了临时数组,因此我可以知道char何时已经输出,并且它不会多次显示相同的char,但它没有帮助,输出这个程序是:

5 个答案:

答案 0 :(得分:1)

我建议使用HashMap。
快速演示:

import java.util.HashMap;

public class Demo {

    public static void main(String[] args){

        char[] inputs = {'a','b','a','b','c','a'};
        HashMap<Character, Integer> map = new HashMap<>();

        for(Character c : inputs){
            if(map.containsKey(c)){
                Integer i = map.get(c);
                i++;
                map.put(c, i);
            }
            else{
                map.put(c, 1);
            }
        }

        System.out.println(map);        
    }

}

将输出:

{b=2, c=1, a=3}

它们的键是你的字符,数字表示它在你的数组中的频率。

答案 1 :(得分:0)

我不会给你一个完整的解决方案,但我会尽力指导你。

您可以制作HashMap<Character, Integer>

如果char已经显示在地图中,请将其增加1,否则,将其添加到地图中。

例如:

put('C', 1);

然后,假设它&#39; C&#39;再一次,你可以这样做:

put('C', get('C') + 1);

由于&#39; C&#39;的是1,现在当你把它放在键上时,键将是2。

答案 2 :(得分:0)

你可以使用scanner.next()

来阅读这个角色
char c = scan.next().charAt(0);

您可以更改以下代码

    Scanner scan = new Scanner(System.in);
    System.out.println("Enter size of array : ");
    int n = scan.nextInt();
    char[] arr = new char[n];

    //Read inputs to array
    for(int i = 0; i < n; i++)
    {
        arr[i] = scan.next().charAt(0);

    }

    //Main Logic

优化您的代码(主逻辑)您可以使用哈希表访问[http://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html]

答案 3 :(得分:0)

在java 8中,它是一行:

return Arrays.stream(arr).collect(Collectors.groupingBy(String::valueOf, Collectors.counting()).get(input);

答案 4 :(得分:0)

您可以通过为每个元素使用数组索引来执行此操作。这样你就不必知道输入,但假设所有输入都是小的。

public class Demo {

    public static void main(String[] args){

        int[] count= new int[26]; // 26 elements for 26 letters
        char[] inputs = {'a','b','a','b','c','a'}; // example input

        for(Character c : inputs){
            count[c-'a'] ++; 
           // if c='b', then c-'a' returns 1, thus increments the count[1].
        }

        for (int i=0; i<26; i++){
            // using if condition I only print the previously encountered letters
            if(count[i]>0)
                System.out.println((char)(i+'a')+":"+count[i]);
        }
    }

}

这样时间复杂度非常低(仅O(number_of_inputs))。