获取用户输入,放入一个数组并打印出每个字母使用了多少次

Posted

技术标签:

【中文标题】获取用户输入,放入一个数组并打印出每个字母使用了多少次【英文标题】:Take user input, put into an array and print out how many times each letter is used 【发布时间】:2016-08-20 23:33:47 【问题描述】:

我正在尝试编写这个程序,以便当用户输入一行文本时,他们会得到一个图表,显示每个字母被使用了多少次。我把它分解成一个数组,但我一直收到“counts[letters[a] == 'a']++;”的错误说我不能将字符串转换为 char 或将布尔值转换为 int,这取决于我输入的方式。我不明白为什么它不是全字符。

import java.util.*;

public class AnalysisA  //open class

public static String input;
public static String stringA;

public static void main (String args [])  //open main 

    System.out.println("Please enter a line of text for analysis:");

    Scanner sc = new Scanner(System.in);
    input = sc.nextLine();
    input = input.toLowerCase();

    System.out.println("Analysis A:");//Analysis A
    System.out.println(AnalysisA(stringA)); 

 // close main 

public static String AnalysisA (String stringA)  // open analysis A

   stringA = input;

   char[] letters = stringA.toCharArray();

   int[] counts = new int[26];

   for (int a = 0; a < letters.length; a++)  //open for 
     counts[letters[a] == 'a']++;
     System.out.print(counts);
    //close for 

【问题讨论】:

使用counts[letters[a] -'a']++; 而不是counts[letters[a] == 'a']++;。原因:在 count[index] 中,索引是 int 类型。当您执行letters[a] == 'a' 时,这将返回一个布尔值。 【参考方案1】:

如果您使用地图,您可以轻松地做到这一点而不会复杂..

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


import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class AnalysisA  // open class

    public static String input;

    public static void main(String args[])  // open main

        System.out.println("Please enter a line of text for analysis:");

        Scanner sc = new Scanner(System.in);
        input = sc.nextLine();
        input = input.toLowerCase();
        sc.close();
        System.out.println("Analysis A:");// Analysis A
        System.out.println(Analysis());

     // close main

    public static String Analysis()  // open analysis A

        Map<Character, Integer> map = new HashMap<Character, Integer>();
        char[] letters = input.toCharArray();
        Integer count;
        for (char letter : letters) 
            count = map.get(letter);
            if (count == null || count == 0) 
                map.put(letter, 1);
             else 
                map.put(letter, ++count);
            
        
        Set<Character> set = map.keySet();
        for (Character letter : set) 
            System.out.println(letter + " " + map.get(letter));
        
        return "";
    

【讨论】:

【参考方案2】:

表达式 letters[a] == 'a' 产生一个布尔值答案(1 或 0),但你有索引一个数组,它必须是一个 int。

你基本上告诉 Java 是做 counts[true]++counts[false]++,这没有意义。

您真正想要的是HashMap,它将每个字符映射到您在数组中看到它的次数。我这里就不放答案了,查一下Java中的HashMaps,你会找到你需要的线索。

【讨论】:

【参考方案3】:

counts[___] 需要一个整数索引,而您的表达式 letters[a] == 'a' 返回一个布尔值

我猜您每次遇到一个字母时都会尝试将“字典”值增加 1。 可以通过letters[a] - 'a'获取索引

由于ASCII table 中的顺序,如果减去等于 97 的字母 'a' 减去另一个字母,例如 'b' 即 98,将产生索引 1,这是您的 base26 '字典的正确位置'

补充:

您应该使用 for (int i = ... 进行索引(i 而不是 a,如果您这样命名您的 index,它很容易混淆变量) 您必须使 在开始执行此操作之前,请确保所有字符都是小写的, 因为正如您在上表中看到的'B' - 'a''b' - 'a' 是两种截然不同的东西。

【讨论】:

以上是关于获取用户输入,放入一个数组并打印出每个字母使用了多少次的主要内容,如果未能解决你的问题,请参考以下文章

Google Sheet Formula:如何计算并打印出数组结果?

编写一个c程序,从键盘输入任意一个五位数,把这个数值分解为单个数字,然后打印出每个数字并且每个数字

将字符放入数组并在 C 中打印

字符串数组不与.equals一起使用

用户输入一个单词然后在java的新行上打印该单词的字母[关闭]

我将如何使用二维数组来打印季度和总计