2012-10-04 5 views
1

본인의 텍스트 북에서 프로그램을 수정할 수있는 권한이 있습니다. 이 프로그램은 사용자로부터 입력 문자열을받은 다음 몇 단어가 입력되었는지 응답합니다. 나의 임무는 이것을 바꾸어 단어 수 대신 문자 수를 계산하는 것이다. 이 잘 작동하지만 배열에 선행 공백을 사용하여 .split을 사용하여 문자를 토큰 화하면 다른 사람이 이유를 설명 할 수 있습니까?.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 

netbeans의 dubug 데이터를 캡처 한 화면이 있지만 게시하기에 충분한 평판이 없습니다. 누군가가보고 싶다면 알려주세요. 나는 그것을 당신에게 보낼 수 있습니다.

미리 감사드립니다.

프랭크

+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()은 분할에 정규 표현식을 사용합니다. 대신 StringUtils library에서 splitXYZ() 메서드 중 하나를 사용할 수 있습니다.이 메서드는 문자열을 구분 기호로 사용하여 훨씬 더 예측 가능한 결과를 생성합니다.

관련 문제