2012-04-15 3 views
0

수업을위한 숙제를 배우고 있으며 거의 ​​모든 문제를 해결했지만 한 부분으로 고민하고 있습니다.문자열 토큰을 계산하는 동안 공백을 무시합니다.

할당을 위해 주어진 문자열에서 문자의 출현 빈도를 계산 한 후 콘솔의지도를 출력하는 프로그램을 작성해야합니다. 프로그램을 작성했는데 거의 제대로 작동하지만 공백을 무시하도록 맵을 가져올 수는 없습니다. 두 가지 다른 종류의 공백도 발견되는 것 같습니다. 하나는 단어 사이의 공간이고 다른 하나는 내가 알아 내지 못하는 공간입니다.

글자의 빈도를 계산하기 전에 myString.replaceAll(" ", "");myString.trim();을 시도했지만 공백을 제거하려고 시도했지만 매회 공백을 두 번 계산합니다.

모든 통찰력이나 도움을 주시면 감사하겠습니다. 나는 이것을 이렇게 돌릴 수는 있지만, 나는 반쯤하는 프로젝트를 좋아하지 않는다.

import java.util.*; 

public class LetterFrequency { 
    public static void main(String[] args) { 

     Map< String, Integer > myMap = new HashMap< String, Integer >(); 

     createMap(myMap); 
     displayMap(myMap); 
    } 


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

     System.out.println("String: "+input); 

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


     for (String token : tokens) { 
     String letter = token.toLowerCase(); 


     if (map.containsKey(letter)) { 
      int count = map.get(letter); 
      map.put(letter, count + 1); 
     } 
     else 
      map.put(letter, 1); 
     } 
    } 


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


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

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


     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()); 
    } 
} 
+0

문자열에있는 공백을 대체하려고하는 코드를 볼 수 있습니다. –

답변

4

String.replaceAll. String.replaceAllString을 반환합니다. 따라서 나머지 계산을 수행하기 위해 반환하는 문자열을 사용해야합니다. 당신이있는 경우 예를 들어

:

String myString = "hello world"; 
myString.replaceAll(" ", ""); 

myString 여전히있을 것 "안녕하세요 세계는"

당신이 원하는 것 : myNewString에 공백이 없을 것이다

String myNewString = myString.replaceAll(" ", ""); 

후.

또한, 당신은 문제를 "계산 된 공백의"추가가 해결됩니다

for (int i = 0; i < input.length(); i++){ 
    char letter = input.charAt(i); 

를 사용하여 문자 반복을 단순화 할 수 있습니다. 이는 myString.split("")을 호출 할 때 반환되는 목록의 첫 번째 요소가 ""(빈 문자열)이기 때문입니다.

+0

이것이 문제였습니다. 새로운 String을 할당해야한다는 것을 알지 못했습니다. 그러나, 나는 아직 계산되지 않은 하나의 공백을 얻고있다. – Speakr

+0

내 대답에서 지적한 반복 기법을 사용하십시오. 추가 공백 개수를 보는 이유에 대한 설명을 추가하여 내 대답을 편집했습니다. –

1

당신은 myString.split("\\s+"); 동시에 모든 공백 및 분할 제거를 시도 할 수 있습니다 : 여기에 코드입니다.

@Kshitij Mehta가 지적했듯이, 해당 메소드의 반환 값을 사용해야합니다. 그래서 코드는 다음과 같습니다

String input = scanner.nextLine(); 
    System.out.println("String: "+input); 
    input = input.trim(); 
    String[] tokens = input.split("\\s+"); 
+0

조금 비싸지 만 모든 토큰에이 코드를 사용해야합니다. –

+0

좋은 지적. 내 대답을 업데이트하여 본인의 것과 비슷하게 보입니다. –

0

대체 String.replaceAll에 : 당신은 filter your input 그들을 계산하기 전에 알파벳이 아닌 문자를 무시 (또는 결과를 인쇄하기 전에 유사지도를 필터링) 할 수 있습니다. 예 :

for (String token : tokens) { 
    if (Character.isLetter(token)) { 
     String letter = token.toLowerCase(); 

     ... 
    } 
    } 
0

다른 방법으로는 캐릭터가 정말 편지 쓰기 여부를 확인하는 Character.isLetter(char c) 방법을 사용할 수 있습니다.

0

@Kshitij Mehta가 정확합니다.

귀하의 문제는 또한, 두 번째 문제는 (문자입니다) 문자를 저장합니다 (맵과 문자) 대신 charStrings을 사용하고 있었다

input = input.replace(" ", ""); 

를 설정하여 공백을 제거하지 않는 조합이다. java를 예기치 않게 수행하는 char에 대한 String의 예기치 않은 사용이었습니다.

관련 문제