【问题标题】:Counting letter occurrences in words [duplicate]计算单词中出现的字母[重复]
【发布时间】:2015-05-07 14:02:46
【问题描述】:

我正在尝试让我的 java 程序计算每个单词中的字母数。现在我用它来计算单词,而不是字母。任何帮助它写信都会很棒!

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

public class LetterTypeCount 
{
    public static void main(String[] args) {
        // create HashMap to store String keys and Integer values
        Map<String, Integer> myMap = new HashMap<>();

        createMap(myMap); // create map based on user input
        displayMap(myMap); // display map content
    }

    // create map from user input
    private static void createMap(Map<String, Integer> map)
    {
        Scanner scanner = new Scanner(System.in); // create scanner
        System.out.println("Enter a string:"); // prompt for user input
        String input = scanner.nextLine();

        // tokenize the input
        String[] tokens = input.split(" ");

        // processing input text
        for (String token : tokens)
        {
            String letter = token.toLowerCase(); // get lowercase letter

            // if the map contains the letter
            if (map.containsKey(letter)) // is letter in map
            {
                int count = map.get(letter); // get current count
                map.put(letter, count + 1); // increment count
            }
            else
                map.put(letter, 1); // add new letter with a count of 1 to map
        }
    }

    // display map content
    private static void displayMap(Map<String, Integer> map)
    {
        Set<String> keys = map.keySet(); // get keys

        // sort keys
        TreeSet<String> sortedKeys = new TreeSet<>(keys);

        System.out.printf("%nMap contains:%nKey\t\tValue%n");

        // generate output for each key in map
        for (String key : sortedKeys)
            System.out.printf("%-10s%10s%n", key, map.get(key));
        System.out.printf("%nsize: %d%nisEmpty: %b%n",
                map.size(), map.isEmpty());
    }
} // end class LetterTypeCount

我想我需要在某处使用 String charAt 方法

【问题讨论】:

  • 你可以简单地使用String.length()方法,然后你把它拆分成单词并将它们加在一起
  • 您想统计字母出现次数吗?
  • 您是否只想计算字母,而忽略空格、数字和标点符号?

标签: java string char


【解决方案1】:

可能不是很优雅,但是:

public class LetterTypeCount 
{
    public static void main(String[] args) {
        // create HashMap to store String keys and Integer values
        Map<String, Integer> myMap = new HashMap<>();

        createMap(myMap); // create map based on user input
        displayMap(myMap); // display map content
    }

    // create map from user input
    private static void createMap(Map<String, Integer> map)
    {
        Scanner scanner = new Scanner(System.in); // create scanner
        System.out.println("Enter a string:"); // prompt for user input
        String input = scanner.nextLine();

        // split to words
        String[] words = input.split(" ");
        for (String word : words) 
        {
            word = word.toLowerCase(); // get lowercase word
            for(int i=0; i<word.length(); i++) 
            {
                char c = word.charAt(i); //get char at position i
                if (map.containsKey(c + "")) // is letter in map
                {
                    int count = map.get(c + ""); // get current count
                    map.put(c + "", count + 1); // increment count
                }
                else
                    map.put(c + "", 1); // add new letter with a count of 1 to map
            }
            // if the map contains the letter
        }
    }

    // display map content
    private static void displayMap(Map<String, Integer> map)
    {
        Set<String> keys = map.keySet(); // get keys

        // sort keys
        TreeSet<String> sortedKeys = new TreeSet<>(keys);

        System.out.printf("%nMap contains:%nKey\t\tValue%n");

        // generate output for each key in map
        for (String key : sortedKeys)
            System.out.printf("%-10s%10s%n", key, map.get(key));
        System.out.printf("%nsize: %d%nisEmpty: %b%n",
                map.size(), map.isEmpty());
    }
} // end class LetterTypeCount

【讨论】:

  • 在if和else语句下,因为char不能转成字符串,所以无法编译
  • 将地图泛型更改为 Map,就像我在上面所做的那样。或者,如果您想保留字符串,那么最简单的解决方案是:map.put(c + "", 1);
  • 这行得通,虽然它只计算唯一字符并且实际上并没有增加
  • 更新了整个代码(只需添加导入)。 100% 确定它有效。
【解决方案2】:

您可以创建一个for 循环,并为数组中的每个字母添加+1 或包含该字母出现的HashMap

for(int i=0; i<= input.length(); i++){
mymap.put(input.charAt(i), myMap.get(input.charAt(i)+1));
}

但是你应该定义你的变量 myMap 全局而不是在你的 main 方法中。

【讨论】:

    【解决方案3】:

    假设您只计算拉丁字符:

    public int[] letters = new int['z' - 'a' + 1];
    
    // count chars:
    for (String token : tokens) 
        for (char c : token.toLowerCase().toCharArray()) 
            if (c >= 'a' && c <= 'z')
                letters[c - 'a']++;
    
    // then print out counts:
    for (int i = 0; i < 'z' - 'a' + 1; i++) 
        if (letters[i] > 0)
            System.out.format("%s occurs %s time(s)\n", (char)('a' + i), letters[i]);
    

    这看起来有点“低级”,但这是工作 Java 代码(刚刚测试过!),它在算术运算上使用 chars 和 ints 的互换性。

    【讨论】:

      【解决方案4】:

      你可以试试 Java 8 Stream API
      除了 Java 流,你还应该知道 Java Lambda Expressions

      String input = "ANY String";
          Map<String, Long> map = Arrays.stream(input.split("")) // Stream String
                  .map(String::toLowerCase) // All letters to lower case
                  .filter(letter -> !letter.equals(" ")) // Remove spaces
                  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
      

      【讨论】:

        【解决方案5】:

        您可以像这样简单地使用str.length()

        System.out.println(key.length());
        

        【讨论】:

        • 试过这个,它有一个“错误:找不到符号 System.out.printf("%d", key.length); variable key"
        • @user3434743 它的 key.length()
        • 这实际上也是我尝试过的,但仍然是同样的错误。
        • @user3434743 我编辑了我的答案,检查一下,然后告诉我你得到了什么。
        • 不幸的是还是同样的错误。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 2013-11-04
        • 1970-01-01
        相关资源
        最近更新 更多