2013-12-16 1 views
0

저는 텍스트에서 가장 많이 사용되는 단어를 계산할 것입니다.이 방법으로 만들고 싶습니다. 어떻게하면 Treemap을 해결할 수 있을지 약간의 도움이 필요합니다. 이것은 어떻게 보이는지입니다. 지금처럼 ...<Integer, List>가있는 Treemap

TreeMap<Integer, List<String>> Word = new TreeMap<Integer, List<String>>(); 
    List<String> TheList = new ArrayList<String>(); 

// 여전히 읽을 수있는 뭔가 ..

while (scanner.hasNext()) { 
     String NewWord = scanner.next().toLowerCase(); 

     if (Word.containsKey(NewWord)) { 
      Word.put(HERE I NEED HELP); 
     } else { 
      Word.put(HERE I NEED HELP); 
     } 

    } 

이 있지만 그래서 내가 싶어 무엇를 NewWord 목록에있는 경우 다음 정수에 하나를 추가하면됩니다 (키) 다음 단어를 다음 목록에 추가하십시오. 키가 (계산) 때문에 단어가 고유해야하므로 ... 는 그것을 다른 작업을 수행 곳

+0

단어 길이가 <0 or > N 일 수 없다는 것을 알고 있습니다. N은 매우 작습니다. Map 대신 ArrayList를 사용할 수 있습니다. –

답변

0

망가 때로는 동일 할 수,

TreeMap<String, Integer> // String represents the word... Integer represents the count 

을 ..

TreeMap<Integer, List<String>> 

대신합니까 길을 계속 읽으십시오. 단어를 계속 읽고지도에 해당 단어가 포함되어 있는지 확인하십시오. 그렇다면 숫자를 증가시키고, 그렇지 않으면 count = 1로 단어를 추가하십시오.

0

유형이 완전히 통합되지 않은 것 같습니다. 당신은 주파수가

당신은 키와 값으로 계산 같은 단어를 갖고 싶어 계산하려면 ...

을 RECT. 정렬 된 컬렉션을 사용할 때 가치는 거의 없지만 HashMap을 사용할 때까지는 시간이 많이 걸리지 않습니다.


Map<String, Integer> frequencyCount = new HashMap<>(); 
while (scanner.hasNext()) { 
    String word = scanner.next().toLowerCase(); 
    Integer count = frequencyCount.get(word); 
    if (count == null) 
     frequencyCount.put(word, 1); 
    else 
     frequencyCount.put(word, 1 + count); 
} 

... 당신이 길이로 키를 원하는 경우. 나는 List<Set<String>>을 사용할 것입니다. 이것은 단어 길이가 양수이고 범위가 한정되어 있고 Set이하도록 설계된 중복 단어를 무시하기를 원하기 때문입니다.

List<Set<String>> wordsByLength = new ArrayList<Set<String>>(); 
while (scanner.hasNext()) { 
    String word = scanner.next().toLowerCase(); 
    // grow the array list as required. 
    while(wordsByteLength.size() <= word.length()) 
     wordsByLength.add(new HashSet<String>()); 
    // add the word ignoring duplicates. 
    wordsByLength.get(words.length()).add(word); 
} 
-1

이 하나

TreeMap<String, Integer> Word = new TreeMap<String,Integer>(); 

while (scanner.hasNext()) { 
    String NewWord = scanner.next().toLowerCase(); 

    if (Word.containsKey(NewWord)) { 
     Word.put(NewWord,Word.get(NewWord)+1); 
    } else { 
     Word.put(NewWord,1); 
    } 

} 
+0

@Prabhakaran : Changed;) – Sach

-1

이 밖으로 시도하십시오 :

 TreeMap<String, Integer> map = new TreeMap<String, Integer>(); 
     Scanner scanner = null; 
     while (scanner.hasNext()) { 
      String NewWord = scanner.next().toLowerCase(); 

      if (map.containsKey(NewWord)) { 
       Integer count = map.get(NewWord); 
       // Add the element back along with incremented count 
       map.put(NewWord, count++); 
      } else { 
       map.put(NewWord,1); // Add a new entry 
      } 

     } 
+0

그는 결과를 카운트별로 정렬하기 위해 트리 맵을 사용하고 있지만, 그렇게하지는 않습니다. –

+0

@TimB - 그렇다면 그는 각 수의지도의 목록 (값)에 같은 길이의 단어를 추가해야합니다 ...하지만 해시 맵을 사용하면 더 의미가 있습니다 (예 ... 답을 보았습니다. .. 그리고 당신 말이 맞아요 ...) – TheLostMind

1

모든 예제는 위의 제대로 불행하게도 그들은이 수를 기준으로 정렬되지 않은,지도로 카운트를 저장하는 당신도 가지고있는 요구 사항.

대신 TreeMap을 사용하지 말고 HashMap을 사용하여 값을 빌드하십시오.

전체 값 목록을 작성한 후에는 entrySet을 HashMap에서 새 ArrayList으로 놓고 그 배열 목록을 Entry<String,Integer>.getValue()으로 정렬 할 수 있습니다.

또는 단어 및 개수가 모두 포함 된 새 "개수"개체를 만들어 사용하십시오.

0

시간 효율적인 방법으로이 문제를 해결하는 방법은 두 개의 맵을 사용하는 것입니다. 하나의 맵은 키에서 카운트 사이에 있어야하고, 다른 맵은 카운트에서 키까지이어야합니다. 서로 다른 패스에서 이들을 조합 할 수 있습니다.

// Biggest values first! 
Map<Integer,List<String>> wordsByFreq = new TreeMap<Integer,List<String>>(new Comparator<Integer>(){ 
    public int compare(Integer a, Integer b) { 
     return a - b; 
    } 
}); 
for (Map.Entry<String,Integer> e : wordCount) { 
    List<String> current = wordsByFreq.get(e.getValue()); 
    if (current == null) 
     wordsByFreq.put(e.getValue(), current = new ArrayList<String>()); 
    current.add(e.getKey()); 
} 

주 첫 번째 단계가 : 당신이 맨 위 키를 읽을 수 있도록

Map<String, Integer> wordCount = new HashMap<String,Integer>(); 
while (scanner.hasNext()) { 
    String word = scanner.next().toLowerCase(); 
    wordCount.put(word, wordCount.containsKey(word) ? wordCount.get(word) + 1 : 1); 
} 

두 번째 단계 반전지도 : 카운트로 키에서지도를 조립해야 할 첫 번째 우리는 주문이 필요 없기 때문에 HashMap을 사용합니다. 단지 빠른 액세스. 두 번째 단계에는 TreeMap이 필요하며 비표준 비교자가 필요하므로 가장 먼저 읽는 값이 가장 빈번한 단어의 목록이됩니다 (두 개 이상의 단어가 가장 빈번하게 사용될 수 있음).

+0

예, 이것은 효과가 있습니다. 두 번째 맵은 동적 카운트가 필요하지 않는 이상 잔인합니다. –

+0

TreeMap을 사용하여 정렬하는 비용은 점진적으로 좋은 정렬과 동일하며 프로그래머가 너무 많은 클래스를 직접 요리해야하는 부담을 덜어줍니다. (그들이 시작한 곳과 더 가깝습니다.) –

관련 문제