2012-10-04 4 views
1

У меня есть назначение для изменения программы из моего учебника. Программа берет строку ввода от пользователя, а затем отвечает, сколько слов было введено. Мое задание - изменить это, чтобы вместо символа слова использовать число символов. У меня это нормально работает, но я получаю ведущее место в массиве, когда я использую .split для tokenize символов, может кто-нибудь объяснить, почему?Ведущее пространство при использовании .split

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

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

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

    // 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 letters = input.replaceAll("\\s", ""); 
     String[] tokens = letters.split(""); 

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

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

    // 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<String>(keys); 

     System.out.println("\nMap contains:\nKey\t\tValue"); 

     // 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 method displayMap 
} // end class WordTypeCount 

У меня есть снимок экрана из dubug данных NetBeans, но у меня не хватает репутации, чтобы разместить его. Если кто-то хочет это увидеть, дайте мне знать, и я могу отправить его вам.

Заранее благодарим за ввод.

Frank

+0

Вы можете использовать ['.trim()'] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim()), чтобы избавиться от ведущих или завершающие пробелы. – Baz

+1

Почему вы не разбиваете на пробелы, чтобы подсчитать слова: 'String [] tokens = letters.split (" \\ s ");' (без строки 'replaceAll')? – assylias

+0

Baz - я могу попробовать .trim(), но после того, как я использую .replaceAll, нет пробелов, но когда я тогда использую .split, ведущее пространство помещает массив в индекс 0. – fmarabate

ответ

0

Почему бы вам не попробовать replaceAll(regex, replacement) метод и wirte простой код, как показано ниже?

Scanner scanner = new Scanner(System.in); // create scanner 
    System.out.println("Enter a string:"); // prompt for user input 
    String inputString = scanner.nextLine(); 
    System.out.println(inputString); 
    System.out.println(inputString.length()); 
    String truncatedString = inputString.replaceAll(" ", ""); 
    System.out.println(truncatedString); 
    System.out.println(truncatedString.length()); 
0

String.split() использует регулярные выражения для расщепления. Вместо этого вы можете использовать один из методов splitXYZ() из StringUtils library, который работает с Strings как разделители и дает гораздо более предсказуемые результаты.

Смежные вопросы