2013-10-18 2 views
0
package opop; 

import java.util.Scanner; 

public class Domashnoto { 

    static public void main(String[] args){ 

     Scanner input = new Scanner(System.in); 
     System.out.println("Text:"); 
     String s = input.next(); 

     s = s.toLowerCase(); 
     s = s.replaceAll("[^A-Za-z]+", ""); 
     s.replaceAll("\\s+", ""); 


     int j; 
     int i; 

     for (j = 0 ; j <= s.length() ; j++){ 
      int counter = 0; 
      for (i = 0 ; i <= s.length(); i++){ 
       if(s.charAt(i) == s.charAt(j)){ 

        counter++; 
       } 
      } 
      System.out.println(s.charAt(i) + " " + "-" + " " + counter); 
     } 



    } 

} 

HELP! 난 그냥 잘 모르겠어요.String에서 모든 문자의 발생을 계산하는 방법은 무엇입니까?

+3

사용 문자가 키이고 발생량이 값인 맵 –

답변

1

두 개의 <= s.length() 루프에 대한 테스트는 < s.length()이어야합니다. 루프가 완료되면

System.out.println(s.charAt(i)...System.out.println(s.charAt(j)...이어야합니다.

s.replaceAll("\\s+", "");은 결과를 s에 다시 지정하지 않으므로 아무 것도 수행하지 않습니다. 그것은 문자열에서 공백을 제거 할 것이지만, 위의 줄은 이미 알파벳이 아닌 문자를 모두 제거하기 때문에 어쨌든 중요하지 않습니다.

처음 몇 가지를 수정하면 효과가 있습니다.


그러나, 조금 깨끗하고 반복적으로 같은 문자를보고 피하는 완전히 다른 접근을 위해, 당신은이 같은 빈도의 수를 정수로 문자를 매핑하는 map를 사용할 수 있습니다

Map<Character,Integer> charMap = new HashMap<>(); 
for (char c : s.toCharArray()) { 
    if (!charMap.containsKey(c)) { 
     charMap.put(c, 1); 
    } else { 
     charMap.put(c, charMap.get(c) + 1); 
    } 
} 

문자열의 각 문자 (c)를 반복하고지도에 해당 문자가 이미 포함되어 있지 않으면 1의 주파수를 할당하거나 포함되어있는 경우 이전 주파수를 가져 와서 1을 더하고 다시 넣습니다.

그럼 당신은 주파수를 표시하는지도를 반복 할 수

본질적으로 무작위 것이다 HashMap에서 문자의 순서를. 각 문자의 첫 번째 모양을 유지하려면 LinkedHashMap으로 변경하거나 알파벳순으로 정렬하려면 TreeMap으로 변경할 수 있습니다.

1

가장 빠른 방법을 (만 65536 개 다른 문자가있을 수 있기 때문에에서만 작동 (PS 당신은 또한 특정 클래스를 import java.util.*;에 필요하거나 가져옵니다,이 방법을 사용하십시오.) :

public static void main(String[] args) { 
    String s = "asdfasdfasasasasa"; 
    int[] counters = new int[65536]; 

    for (char c: s.toCharArray()) ++counters[c]; 
    for (int i = 0; i < counters.length; ++i) { 
     if (counters[i] > 0) System.out.println((char)i + " - " + counters[i]); 
    } 
} 
+1

참고 : Java에서 이미 수행 한 것처럼 배열을 0으로 초기화 할 필요는 없습니다. – Boann

관련 문제