2012-05-18 3 views
0

문자열의 각 고유 문자의 평균을 얻고 싶습니다. 설명하기 쉽기 때문에 여기에 예제가 있습니다.자바 문자열의 각 문자의 상대 빈도 얻기

문자열 : 공백을 포함하여 각 문자의

The big brown fox 

평균 :

T = 1/17 = .058 
h = 1/17 = .058 
e = 1/17 = .058 
' '= 3/17 = .176 
b = 2/17 = .117 
i = 1/17 = .058 
g = 1/17 = .058 
r = 1/17 = .058 
o = 2/17 = .117 
w = 1/17 = .058 
n = 1/17 = .058 
f = 1/17 = .058 
x = 1/17 = .058 

지금까지 내 모든 시도가, 내 머리가 순간에 작동하지 않는 생각 실패했습니다. 이 코드는 어떻게 작성합니까? 도움이나 의견을 크게 주시면 감사하겠습니다.

나는이 코드를 해결책으로 갖고있다. 여기에 코드를 붙여 넣을 때 사본이 나왔습니다. 몇 분 전에 똑같은 대답을했기 때문에 이것이 재 게시가 아니기를 바랍니다. 그러나 그것은 나타나지 않았습니다. 여기

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

     String a = "The big brown fox"; 


     for (int x=0; x<a.length(); x++){ 
      char getChar = a.charAt(x); 
      String convGetChar = Character.toString(getChar); 

      Integer countChar = storeCharCount.get(convGetChar); 
      storeCharCount.put(convGetChar, (countChar==null?countChar=1:countChar+1)); 

     } 
     System.out.println("Map: "+ storeCharCount); 
     double RelFrequency = 0; 
     for (Map.Entry<String, Integer> getValue: storeCharCount.entrySet()){ 

      RelFrequency = (double)(getValue.getValue())/(a.length()); 
      System.out.println("Character "+getValue.getKey() +" Relative Frequency: "+RelFrequency); 

     } 

내가 그것이 가장 좋은 방법은 아니라고 생각

Map: {f=1, g=1, =3, e=1, b=2, n=1, o=2, h=1, i=1, w=1, T=1, r=1, x=1} 
Character f Relative Frequency: 0.058823529411764705 
Character g Relative Frequency: 0.058823529411764705 
Character Relative Frequency: 0.17647058823529413 
Character e Relative Frequency: 0.058823529411764705 
Character b Relative Frequency: 0.11764705882352941 
Character n Relative Frequency: 0.058823529411764705 
Character o Relative Frequency: 0.11764705882352941 
Character h Relative Frequency: 0.058823529411764705 
Character i Relative Frequency: 0.058823529411764705 
Character w Relative Frequency: 0.058823529411764705 
Character T Relative Frequency: 0.058823529411764705 
Character r Relative Frequency: 0.058823529411764705 
Character x Relative Frequency: 0.058823529411764705 
+2

java.util.HashMap에 될 가장 똑바로 앞으로 솔루션 <문자, 정수> – Corbin

+0

: 다른 발견 다음 1. 추가 인쇄 결과를 다시 반복 할 경우, 문자열, 업데이트 주파수에서 모든 문자를 통해 반복하여 시작 당신이 한 일을 우리가 보여 주면 그곳에서 일할 수 있습니까? 나는 우리 모두가 그것으로부터 배울 수있을 것이라고 확신한다. – Ewald

+0

map.put (character, charCount = null? charCount = 0 : charCount + 1)을 사용하여 변형을 시도했지만이 코드는 각 문자의 합계를 제공 할 수 있으며이 맵의 값 부분을 얻는 데 어려움이 있습니다. " 지도 (키, 값) ". – dimas

답변

1

제 제안입니다.

 String s = "The big brown fox"; 
    Map<Character, Float> m = new TreeMap<Character, Float>(); 
    for (char c : s.toCharArray()) { 
     if (m.containsKey(c)) 
      m.put(c, m.get(c) + 1); 
     else 
      m.put(c, 1f); 
    } 

    for (char c : s.toCharArray()) { 
     float freq = m.get(c)/s.length(); 
     System.out.println(c + " " + freq); 
    } 
+0

안녕하세요, 저는 귀하의 코드가 마음에 들지만 그 제품은 제가 가지고있는 것과 동일한 결과물이라고 생각합니다. 곧이 유사본을 사용하겠습니다. 당신의 도움을 주셔서 감사합니다! – dimas

+0

이 경우 다른 맵 구현에 비해 TreeMap을 선택하는 특별한 이유가 있습니까? – Abhilash

+0

당신이 내게 묻는다면 내 사건에 도움이된다. 왜냐하면 그 값을 쉽게 분류 할 수 있기 때문이다. 그 외에는 모르겠다. – dimas

0

출력입니다하지만 당신은 [AZ] [AZ] 각 문자를 계산하고 모든 제거 ""한 다음의 = 수를 계산할 수 있습니다 편지/모든 편지.

도움이되기를 바랍니다.

+0

고유 한 문자 부분이므로 공백을 제거 할 수 없습니다. 또한 나는 z-A-Z로 계산하는 것이 적어도 0-700 자의 최소 문자열을 가진 최소 80M 문자열을 필요로하므로 그렇게 효율적이지 않을 것이라고 생각합니다. 그러나 답장을 보내 주셔서 감사합니다. – dimas

+0

@dimas : 80M string은 실제로 큰 문자가 아닙니다. 모든 문자를 1 초 안에 반복 할 수 있기 때문입니다. 정확한 답이 필요한 경우 모든 문자를 반복해야합니다. 그렇지 않으면 빈도를 어떻게 계산할 수 있습니까? 또 다른 방법은 대략적인 결과가 받아 들여질 수있는 경우 문자를 무작위로 샘플링하는 것입니다. – Helium

+0

안녕 Mohsen 조작하려고하는 데이터는 이미 수집 된 약 14 시간의 데이터 수집을 위해 1.7B의 원래 문자열 수를 이미 샘플링했습니다. 나는 여전히 14 시간 동안 4 일 더 필요하다. 그래도 그것에 대한 당신의 생각을 감사드립니다. – dimas