2015-05-07 81 views
1

我正試圖讓我的程序在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方法某處

+0

你可以簡單地使用'string.length減()'你把它分解成單詞並將它們加在一起之後的方法 – SomeJavaGuy

+0

你想計算字母出現嗎? – Praeterii

+0

@Peterterii是的。 – user3434743

回答

3

可能並不十分優雅,但:

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 
+0

這最後一件事,它不會編譯,因爲字符不能被轉換爲字符串 – user3434743

+0

更改地圖泛型爲Map 正如我在那裏做的那樣。或者如果你想保留字符串,那麼最簡單的解決方案是:map.put(c +「」,1); – Praeterii

+0

雖然它工作,但它只計算唯一的字符,並沒有實際增量 – user3434743

1

假設你算只有拉丁字符:

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代碼(剛剛測試!),它在算術操作上使用了char s和int的可互換性。

0

您可以簡單地使用str.length()像這樣:

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

試過這個,它有一個「錯誤:無法找到符號System.out.printf(」%d「,key.length);變量鍵」 – user3434743

+0

@ user3434743其key.length() – Mekap

+0

這實際上我也試過,但仍然是相同的錯誤。 – user3434743

1

您可以創建一個for循環,並添加+1每個字母一個數組或一個HashMap包含字母次數。

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

但是你應該定義你的變量myMap global並且不在你的main方法中。

0

您可以嘗試的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()));