2015-05-07 5 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 

Я думаю, мне нужно использовать струнный Шара метод где-то

+0

вы можете просто использовать 'String.length() 'После того, как вы разделили его на слова и добавили их вместе – SomeJavaGuy

+0

Вы хотите подсчитать буквы вхождения? – Praeterii

+0

@Praeterii да. – 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

под инструкциями if и else, она не будет скомпилирована, потому что char не может быть преобразован в строку – user3434743

+0

Измените карту generics на 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 глобальный, а не внутри вашего основного метода.

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())); 
Смежные вопросы