简体   繁体   English

(Java)在句子中计算字母?

[英](Java) Counting letters in a sentence?

The following is my code: 以下是我的代码:

char[] array = new char[26] ;

    int index = 0 ;
    int letter = 0 ;
    int countA = 0 ;

    String sentence = "Once upon a time..." ;

    if(sentence.contains("."))
    {
        String sentenceNoSpace = sentence.replace(" ", "").toLowerCase() ;
        String sentenceFinal = sentenceNoSpace.substring(0, sentenceNoSpace.indexOf(".")) ;
        char[] count = new char[sentenceFinal.length()] ;
        for (char c = 'a'; c <= 'z'; c++) 
        {
            array[index++] = c ;
            for(int i = 0; i < sentenceFinal.length(); i++)
            {
                if(sentenceFinal.charAt(i) == c)
                    count[letter++] = c ; 
                //if(sentenceFinal.charAt(i) == 'a')    
                    //countA++ ;   
            }

        }
        String result = new String(count) ; // Convert to a string.
        System.out.println("\n" + result) ;

        System.out.println("\nTotal number of letters is " + result.length()) ;
        System.out.println(countA) ;
    }
    else
    {
       System.out.println("You forgot a period. Try again.") ;
    }

I am having trouble counting how many a's, b's, c's, etc. are in a given sentence. 我无法计算给定句子中有多少个a,b,c等。 There is one way I can do it and it is this part 我有一种方法可以做到,这就是这一部分

//if(sentenceFinal.charAt(i) == 'a')    
                //countA++ ;

which I can just create all the way to z. 我可以一直创建到z Is there a more efficient way? 有没有更有效的方法?

Note: No using Hashmap or any other advance techniques. 注意:请勿使用Hashmap或任何其他高级技术。

There is no need of eliminating spaces. 无需消除空间。 This is just additional work you're doing. 这只是您正在做的其他工作。

int countOfLetters = 0 ;
String sentence = "Once upon a time..." ;
sentence = sentence.toLowerCase();
int[] countOfAlphabets = new int[26];
for (int i = 0; i < sentence.length(); i++) {
    if (sentence.charAt(i) >= 'a' && sentence.charAt(i) <= 'z') {
        countOfAlphabets[sentence.charAt(i) - 97]++;
        countOfLetters++;
    }
}

So, countOfLetters will give you the total count of letters. 因此, countOfLetters将为您提供字母的总数。 If you want individual count, suppose for example, you want count of 'c' , 例如,如果您要进行个体计数,则您想计数'c'

You can get it by accessing countOfAlphabets array like countOfAlphabets['c' - 97] (97 being the ASCII value of 'a') 您可以通过访问countOfAlphabets数组(例如countOfAlphabets['c' - 97] (97是'a'的ASCII值))来获取它

Use an int array letterCounts that will store the counts for each letter. 使用int数组letterCounts将存储每个字母的计数。 Assuming the case of the letters can be ignored, the length of the letterCounts array will be 26. 假设字母的大小写可以忽略,则letterCounts数组的长度为26。

Iterate over the string's characters and update the corresponding integer in the array. 遍历字符串的字符并更新数组中的相应整数。 Use its ASCII value to find the corresponding index, as follows. 使用其ASCII值查找相应的索引,如下所示。

letterCounts[c - 97]++

97 is the ASCII value of 'a', whose count needs to be stored at index 0. ASCII值“ a”为97,其计数需要存储在索引0中。

In this way, subtracting 97 from the character's ASCII value will give the corresponding index for that character. 这样,从字符的ASCII值中减去97将得到该字符的相应索引。

Note: This is assuming that you want to store the counts for lowercase letters. 注意:这是假设您要存储小写字母的计数。

Pretty fiddly without using maps, but this will count all characters in a string. 不用地图就可以了,但这会计算字符串中的所有字符。

You might want to modify to exclude things like spaces etc. 您可能需要修改以排除空格等内容。

public class Main {

    public static void main(String[] args) {
        String sentence = "Once upon a time...";

        // Create an array of size 256 ASCII_SIZE
        int count[] = new int[256];
        int length = sentence.length();

        // Initialize count array index
        for (int i = 0; i < length; i++)
            count[sentence.charAt(i)]++;

        // Create an array of given String size
        char chars[] = new char[sentence.length()];
        for (int i = 0; i < length; i++) {
            chars[i] = sentence.charAt(i);
            int find = 0;
            for (int j = 0; j <= i; j++) {

                // If any matches found
                if (sentence.charAt(i) == chars[j])
                    find++;
            }

            if (find == 1) {
               System.out.println("Occurrence of " + sentence.charAt(i) + " is:" + count[sentence.charAt(i)]);

            }
        }
    }
}

Which outputs: 哪个输出:

Occurrence of O is:1
Occurrence of n is:2
Occurrence of c is:1
Occurrence of e is:2
Occurrence of   is:3
Occurrence of u is:1
Occurrence of p is:1
Occurrence of o is:1
Occurrence of a is:1
Occurrence of t is:1
Occurrence of i is:1
Occurrence of m is:1
Occurrence of . is:3

Check Below code You can have a 26 length array and index will increment according to the presence of the alphabet. 检查下面的代码您可以具有26个长度的数组,索引将根据字母的存在而增加。

public void getResult(){

        int [] charCount = new int [26];
        int countA = 0 ;

        String sentence = "Once upon a time..." ;

        if(sentence.contains("."))
        {
            String sentenceNoSpace = sentence.replace(" ", "").toLowerCase() ;
            String sentenceFinal = sentenceNoSpace.substring(0, sentenceNoSpace.indexOf(".")) ;

            char[] sentenceCharArray = sentenceFinal.toCharArray();
            //char a = 97;
            for (int i = 0; i <sentenceCharArray.length ; i++) {
                int index = sentenceCharArray[i] - 97 ;
                if(index >= 0 && index <= 26) {
                    charCount[index] += 1;
                }
            }


            System.out.print("Result : ");

            for (int i = 0; i < charCount.length ; i++) {
                System.out.print(charCount [i]+" , ");
            }


            System.out.println("\nTotal number of letters is " + sentenceCharArray.length) ;
        }
        else
        {
            System.out.println("You forgot a period. Try again.") ;
        }
    }

Since there are 26 letters in the US alphabet, you can use an int[] with a size of 26 由于美国字母表中有26个字母,因此您可以使用大小为26的int[]

int[] letterCount = new int[26];

to hold the count of each letter where index 0 represents 'a', 1 represents 'b', etc... 保留每个字母的计数,其中索引0代表'a',1代表'b',依此类推...

As you traverse through the sentence, check if the character you're on is a letter, Character.isLetter() , then increment the element in the array that represents the letter. 当您遍历句子时,请检查您所使用的字符是否为字母Character.isLetter() ,然后递增表示字母的数组中的元素。

letterCount[letter - 'a']++;

We subtract 'a' from the letter to give us the correct index. 我们从字母中减去“ a”来给我们正确的索引。

Code Sample 代码样例

package stackoverflow;

public class Question {

    public static void main(String[] args) {
        String sentence = "The quick brown fox jumps over the lazy dog.";
        int[] letterCount = new int[26];
        if (sentence.contains(".")) {
            // toLowerCase() the sentence since we count upper and lowercase as the same
            for (char letter : sentence.toLowerCase().toCharArray()) {
                if (Character.isLetter(letter)) {
                    letterCount[letter - 'a']++;
                }
            }

            // Display the count of each letter that was found
            int sumOfLetters = 0;
            for (int i = 0; i < letterCount.length; i++) {
                int count = letterCount[i];
                if (count > 0) {
                    System.out.println((char)(i + 'a') + " occurs " + count + " times");
                    sumOfLetters += count;
                }
            }

            System.out.println("Total number of letters is " + sumOfLetters);
        } else {
            System.out.println("You forgot a period.  Try again.");
        }
    }
}

Result 结果

a occurs 1 times
b occurs 1 times
c occurs 1 times
d occurs 1 times
e occurs 3 times
f occurs 1 times
g occurs 1 times
h occurs 2 times
i occurs 1 times
j occurs 1 times
k occurs 1 times
l occurs 1 times
m occurs 1 times
n occurs 1 times
o occurs 4 times
p occurs 1 times
q occurs 1 times
r occurs 2 times
s occurs 1 times
t occurs 2 times
u occurs 2 times
v occurs 1 times
w occurs 1 times
x occurs 1 times
y occurs 1 times
z occurs 1 times
Total number of letters is 35

Rebuttal Question 反驳问题

What is wrong with using Java 8 and using the chars() of a String ? 使用Java 8和使用Stringchars()有什么问题? With it, you can accomplish the same thing with less code. 有了它,您可以用更少的代码完成相同的事情。 For the total number of letters, we just use String.replaceAll() and remove all non-letters from the String with the pattern [^A-Za-z] and use the length() of the result. 对于字母总数,我们只使用String.replaceAll()并使用[^A-Za-z]模式从String删除所有非字母,然后使用结果的length()

package stackoverflow;

import java.util.function.Function;
import java.util.stream.Collectors;

public class Question {

    public static void main(String[] args) {
        String sentence = "The quick brown fox jumps over the lazy dog.";

        System.out.println(sentence.toLowerCase().chars()
            // Change the IntStream to a stream of Characters
            .mapToObj(c -> (char)c)
            // Filter out non lower case letters
            .filter(c -> 'a' <= c && c <= 'z')
            // Collect up the letters and count them
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())));

        System.out.println("Total letter count is " + sentence.replaceAll("[^A-Za-z]", "").length());               
    }
}

Result 结果

{a=1, b=1, c=1, d=1, e=3, f=1, g=1, h=2, i=1, j=1, k=1, l=1, m=1, n=1, o=4, p=1, q=1, r=2, s=1, t=2, u=2, v=1, w=1, x=1, y=1, z=1}
Total letter count is 35

You can solve it with Regex If Regex wont be considered as High-tech 🙂 如果Regex不会被视为高科技If,则可以使用Regex解决。

Idea is simple: Remove all letters and subtract output from original string length to get counter 想法很简单: 删除所有字母,然后从原始字符串长度中减去输出以得到计数器

String sentence = "Once upon a time...";
String noLetterString = sentence.replaceAll("[a-zA-Z]", "");
int counterLetter = sentence.length() - noLetterString.length();
System.out.println("counter:" + counterLetter);

By old school programming 🙂 Idea here is in reverse, appending only letters 通过老派编程🙂这里的想法是相反的,仅添加字母

String sentence = "Once upon a time...";
String lowerCase = sentence.toLowerCase(); // to avoid comparison to UpperCase letters
StringBuilder counterStr = new StringBuilder();
for (char l : lowerCase.toCharArray()) {
    if (l >= 'a' && l <= 'z') {
        counterStr.append(l);
    }
}

System.out.println("counterStr:" + counterStr);
System.out.println("counter:" + counterStr.length());

Here is the Update Code : 这是更新代码:

int[] array = new int[26] ;

    String sentence = "Once upon a time..." ;

    if(sentence.contains("."))
    {
        String sentenceNoSpace = sentence.replace(" ", "").toLowerCase() ;
        String sentenceFinal = sentenceNoSpace.substring(0, sentenceNoSpace.indexOf(".")) ;

        for (char c : sentenceFinal.toCharArray()) 
        {
            System.out.println(c+"  "+(c-97)); 
            array[c-97] += 1;     
        }

      // System.out.println("\n" + Arrays.toString(array)) ;

        for(int i=0; i< array.length;i++) {

            if(array[i] != 0) {

            char c = (char)(i+97);
            System.out.println(c+" occured "+ array[i]+" times");
          }
        }
    }
    else
    {
       System.out.println("You forgot a period. Try again.") ;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM