计算字符串中每个字母的出现次数

时间:2015-10-23 22:13:40

标签: java arrays string loops char

我知道此主题已经涵盖过,但我找不到我需要的东西。我试图计算字母表中每个字母的出现次数;来自用户输入的字符串。输出将包括所有26个字母,即使它们没有出现。因此,将为未发生的字母分配0。我通过循环遍历字母数组并将其与用户输入进行比较来实现此目的。

我在添加字母和显示每个字母时遇到问题。我的输出导致显示每个字母inputed + 1.

.

输出

    public class TwoArrays {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        char[] lower = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char[] upper = new char[] {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

        System.out.println("Please enter a sentence to parse.");
        String userString = input.nextLine();

        for(int i = 0; i < userString.length(); i++) {
            //lowercase
            for(int l = 0; l < lower.length; l++) {
                int counter = 0;
                if(lower[l] == userString.charAt(i)) {
                    counter++;
                    System.out.println(lower[l] + ":" + counter);
                }
            }   
            //uppercase
            for(int u = 0; u < upper.length; u++) {
                int counter = 0;
                if(upper[u] == userString.charAt(i)) {
                    counter++;
                    System.out.println(upper[u] + ":" + counter);
                }
            }
        }
    }
}

7 个答案:

答案 0 :(得分:1)

使用增强型循环+ HashMap,您可以统一包含两个char的数组:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    char[] array = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
            'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

    System.out.println("Please enter a sentence to parse.");
    String userString = input.nextLine();

    HashMap<Character, Integer> charint = new HashMap<>();

    for (Character c : userString.toCharArray()){
        if (charint.containsKey(c)) charint.replace(c, charint.get(c).intValue() + 1);
        else charint.put(c, 1);
    }

    for (int i = 0 ; i < array.length ; i++){
        System.out.println(array[i] + " : " + (charint.get(array[i]) == null ? "0" : charint.get(array[i])));
    }
}

<强>输出

Please enter a sentence to parse.
Hello the world
a : 0
b : 0
c : 0
d : 1
e : 2
f : 0
g : 0
h : 1
i : 0
j : 0
k : 0
l : 3
m : 0
n : 0
o : 2
p : 0
q : 0
r : 1
s : 0
t : 1
u : 0
v : 0
w : 1
x : 0
y : 0
z : 0
A : 0
B : 0
C : 0
D : 0
E : 0
F : 0
G : 0
H : 1
I : 0
J : 0
K : 0
L : 0
M : 0
N : 0
O : 0
P : 0
Q : 0
R : 0
S : 0
T : 0
U : 0
V : 0
W : 0
X : 0
Y : 0
Z : 0

答案 1 :(得分:0)

这是一个不区分大小写的英文字母计数应用程序版本:

public static void main(final String[] args) {
    System.out.println("Please enter a sentence to parse.");
    try (final Scanner input = new Scanner(System.in)) {
        final String userString = input.nextLine();

        final long[] symbols = new long[26];
        for (final char c : userString.toCharArray()) {
            if ((c >= 'a') && (c <= 'z')) {
                symbols[c - 'a']++;
            } else if ((c >= 'A') && (c <= 'Z')) {
                symbols[c - 'A']++;
            }
        }
        for (int i = 0; i < 26; i++) {
            System.out.println((char) ('a' + i) + ": " + symbols[i]);
        }
    }
}

“hello WORLD”的示例输出:

a: 0
b: 0
c: 0
d: 1
e: 1
f: 0
g: 0
h: 1
i: 0
j: 0
k: 0
l: 3
m: 0
n: 0
o: 2
p: 0
q: 0
r: 1
s: 0
t: 0
u: 0
v: 0
w: 1
x: 0
y: 0
z: 0

答案 2 :(得分:0)

以下是使用hashmap的方法。由于您要将0显示为不在字符串中的char,我们可以put map中的所有字符value。然后我们可以迭代字符串并增加找到的字符Map<Character, Integer> charMap = new HashMap<Character, Integer>(); for (Character c: "abcdefghijklmnopqrstuvwxyz".toCharArray()) { charMap.put(c, 0); } for (Character c: test.toCharArray()) { if (charMap.containsKey(c)) { charMap.put(c, charMap.get(c) + 1); } }

{{1}}

Demo

答案 3 :(得分:0)

使用Google Guava的Multiset,您可以摆脱不必要的样板并在单行中计算区分大小写的直方图(使用input.toLowerCase().toCharArray()表示不区分大小写):

String input = "hello WORLD";
Multiset<Character> histogram = HashMultiset.create(
    Chars.asList(input.toCharArray()));

直方图可以这样输出:

public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
//...
final List<Character> caseSensitiveAlphabet 
    = Lists.newArrayList(Chars.asList(ALPHABET.toCharArray()));
caseSensitiveAlphabet.addAll(
    Chars.asList(ALPHABET.toUpperCase().toCharArray()));

for (char c : caseSensitiveAlphabet) {
    System.out.println(c + " : " + histogram.count(c));
}

答案 4 :(得分:0)

// does not work...
context.getBeansOfType(Publisher<pubInfo.getClass()>.class);

认为这会对你有所帮助。

答案 5 :(得分:0)

在Java 8中,你可以解决这个问题:

    String input = "Hello WORLD";

    Map<Character, Integer> map = new TreeMap<>();

    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
            .chars()
            .mapToObj(i -> (char) i)
            .forEach(c -> map.put(c, 0));

    input.chars()
            .mapToObj(i -> (char) i)
            .forEach(c -> map.computeIfPresent(c, (k, v) -> v + 1));

    System.out.println(map);

这将产生:

{A = 0,B = 0,C = 0,D = 1,E = 0,F = 0,G = 0,H = 1,I = 0,J = 0,K = 0,L = 1,M = 0,N = 0,O = 1,P = 0,Q = 0,R = 1,S = 0,T = 0,U = 0,V = 0,W = 1,X = 0, Y = 0,Z = 0,a = 0,b = 0,c = 0,d = 0,e = 1,f = 0,g = 0,h = 0,i = 0,j = 0,k = 0,l = 2,m = 0,n = 0,o = 1,p = 0,q = 0,r = 0,s = 0,t = 0,u = 0,v = 0,w = 0, x = 0,y = 0,z = 0}

答案 6 :(得分:0)

这是最简单的答案,不使用任何包...

这里我有一个字符串,首先我将这个字符串转换为chararray然后我运行了一个循环来计算这个字符串中的字母数量。

因为每个字母至少出现一次,所以我已经将1分配给了一个标志c,用于存储每个字母的出现次数。

现在我运行嵌套循环以检查字母表是否出现多次..如果它确实发生,我将标志c递增1然后我从k = j运行第三个嵌套循环以删除这个重复的字母表...

这里j是重复字母表的索引并且删除该字母表我将下一个(j + 1)索引处的值分配给该(j)索引,并且索引j + 2处的值被分配给索引j + 1。 ...依此类推,直到我达到n-1指数,该指数现在被指定为第n个指数的值。

删除这个重复的字母后,chararray的大小减少1,所以我将n减1。

    public class AlphabetOccurance {
public static void main(String[] args) {
    String s;
    s = "ASGFDTRRCJFYDCJHGJ";
    char ch[] = s.toCharArray(); // converted string to chararray       
     int i,j,k,c=1,n;
     for (i=0; i<s.length();i++); // loop to find no. of alphabet in string
     n=i;
     System.out.println("number of charaters in string = " + n); 
     for (i=0; i<n;i++)
     {
        for (j=i+1; j<n ;j++)
        {
            if (ch[j] == ch[i]) //if an alphabet if repeated...
            {
                c++; // if repeated alphabet found, increment count by 1

                for (k=j; k<n-1;k++) //loop to delete repeated alphabet
                {
                    ch[k] = ch[k+1];//deleting repeated alphabet
                }
             n--; // after deleting repeated alphabet, n is decremented by 1
            }
         }
       System.out.println("alphabet " + ch[i] + " occured " + c + " times");

       c=1; // for counting of next alphabet, now initialized c back to 1
     }  
}}

<强>输出:

string = 18

中的字符数

字母A出现1次

字母S出现1次

字母G出现2次

字母F出现2次

字母D出现2次

字母T出现1次

字母表R出现2次

字母C出现2次

字母表J出现3次

字母Y出现1次

字母H发生1次