【问题标题】:Count letters in a string Java计算字符串中的字母Java
【发布时间】:2013-10-03 16:03:31
【问题描述】:

我正在做一个作业,我必须编写一个程序来读取来自用户的字符串,并打印出字符串中出现次数的字母。 例如“Hello world”应该打印出“h=1 e=1 l=3 o=2 ... etc.”,但我的只写“hello world”和字母总数。我不能使用 hashmap 函数,只能使用数组。有人可以给我一两个关于如何从下面的书面代码中获得我喜欢的功能的提示吗?我不明白如何将写入的输入保存在数组中。

这是我目前的代码。

public class CountLetters {
    public static void main( String[] args ) {
        String input = JOptionPane.showInputDialog("Write a sentence." );
        int amount = 0;
        String output = "Amount of letters:\n";

        for ( int i = 0; i < input.length(); i++ ) {
            char letter = input.charAt(i);
            amount++;
            output = input;
        }
        output += "\n" + amount;
        JOptionPane.showMessageDialog( null, output,
                             "Letters", JOptionPane.PLAIN_MESSAGE ); 
    }
}

【问题讨论】:

  • 请编辑您的问题并删除与您的问题无关的所有内容。摇摆没关系。
  • 创建一个包含 26 个元素的数组。增加与字母对应的那个——注意字母的 ASCII 值是连续的(从 ASCII 值中减去一个常数以获得需要增加的元素的索引)。注意A-Z 范围之外的值,并确保处理小写/大写问题。仅打印非零元素的结果。祝你作业顺利。

标签: java arrays


【解决方案1】:

您不需要 26 个switch 案例。只需使用简单的代码来计算字母:

    String input = userInput.toLowerCase();// Make your input toLowerCase.
    int[] alphabetArray = new int[26];
    for ( int i = 0; i < input.length(); i++ ) {
         char ch=  input.charAt(i);
         int value = (int) ch;
         if (value >= 97 && value <= 122){
         alphabetArray[ch-'a']++;
        }
    }

完成计数操作后,结果显示为:

 for (int i = 0; i < alphabetArray.length; i++) {
      if(alphabetArray[i]>0){
        char ch = (char) (i+97);
        System.out.println(ch +"  : "+alphabetArray[i]);   //Show the result.
      }         
 }

【讨论】:

  • 实际上 - 还有一条评论。 isLetter 不保证letter - 'a' 在[0, 25] 范围内。 “其他”字符(重音等)会导致您的代码崩溃。
  • 我可以建议最后一个改进:int chIndex = (int) ch - 'a'; if (chIndex &gt;= 0 &amp;&amp; chIndex &lt; 26) alphabetArray[chIndex]++; 更易读(虽然它在功能上是等效的)。
【解决方案2】:
  • 创建一个长度为 26 的整数数组。
  • 迭代字符串的每个字符,递增存储在与每个字符关联的数组中的值。
  • 数组中每个字符的索引由x - 'a'(小写字符)和x - 'A'(大写字符)计算,其中x 是特定字符。

【讨论】:

  • 当我开始输入这个答案时,没有答案,只有 Technodrama 的评论。我想我只是一个打字慢的人。
  • 别担心 - 我只是觉得这很有趣。我的偏好是,当人们发布“帮我做作业”的问题时,只写带有提示的 cmets - 让他们做更多的思考。
  • 你好弗洛里斯。在这里。这也是我的偏好,提示。这就是为什么我在我的帖子中问“给出一两个提示”,因为这是家庭作业。我设法从你的帖子中编写了一个还不错的程序,Colin,但是 Masud 的帖子帮助我进一步优化它,使我学到了一两个技巧。我希望我能给你投票,但它说我需要 15 个帖子。
【解决方案3】:

您可以创建一个数组,其中第一个元素代表“a”,第二个元素代表“b”等。如果您需要区分大小写,则可以在末尾添加。该数组的所有值在开始时都等于 0。 然后你遍历你的句子并在数组上增加所需的值。 最后打印所有大于 0 的值。简单吗?

如果您需要更多帮助,请告诉我

【讨论】:

    【解决方案4】:

    不,你不应该创建一个 26 的数组。如果字符串包含意外字符,这将中断。 (ä、ö、ü 有人吗?) 正如我指出的那样,我的评论使用地图。这将适用于所有可能的角色。

    【讨论】:

    • 尽管我们很喜欢 Map,但不允许 OP 使用它。 OP 明确指出我不能使用哈希图,只能使用数组。为什么您仍然建议使用基于地图的解决方案?
    • 转换为小写,减去@​​987654321@,检查您是否在0 和25 之间,然后递增。否则什么都不做。
    • 此外,如果您仍想处理特殊字符的情况,为什么不创建一个包含所有 unicode 字符(95,221)的数组大小并重复相同的过程。在内存中为超过 95K 的内存位置保留空间是低效的,但可以有效地处理特殊字符
    【解决方案5】:

    导入 java.io.*;

    公共类 CharCount {

    public static void main(String[] args) throws IOException
    {
        int i,j=0,repeat=0;
        String output="",input;
        char c=' ';
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        System.out.println("enter name ");
        input=br.readLine();
        System.out.println("entered String ->\""+input+"\"");
        input=input.toLowerCase();
    
        for(i=0;i<input.length();i++)
        {
            for(j=0;j<output.length();j++)
            {
                if(input.charAt(i)==output.charAt(j) || input.charAt(i)==c)
                {
                    repeat=1;
                    break;
                }
            }
            if(repeat!=1)
            {
                output=output+input.charAt(i);
            }
            repeat=0;
        }
    
        System.out.println("non-reepeated chars in name ->\""+output+"\"");
    
        int count[]=new int[output.length()];
        for(i=0;i<output.length();i++)
        {
            for(j=0;j<input.length();j++)
            {
                if(output.charAt(i)==input.charAt(j))
                    count[i]=count[i]+1;
            }
        }
        for(i=0;i<output.length();i++)
            System.out.println(output.charAt(i)+"- "+count[i]);
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2023-02-24
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      相关资源
      最近更新 更多