2015-11-19 42 views
-2

我試圖從文本塊中獲取前5個使用過的單詞。我已經建立了一個單詞地圖,其中包含該單詞已被使用了多少次的值。獲取java中文本塊中前5個使用的單詞

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

for(Status status3 : statuses){ 

    String mdry = status3.getText(); 
    String[] statusSplitOnSpace = mdry.split(" "); 

    for(String wordInStatus : statusSplitOnSpace){ 
     for(String str : statusSplitOnSpace){ 
       if(doesListContainWord(str)){ 
       incrementKeyofWordInList(str); 
      }else{ 
       if(doesWordCountAsAWord(str)){ 
        addNewWordToList(str); 
       } 
      } 
     } 
    } 

Set keys = list.keySet(); 
for (Iterator i = keys.iterator(); i.hasNext() ;){ 
     String key = (String) i.next(); 
     String value = (String) list.get(key); 
     //if(value.length()>10) 
     System.out.println("Word (" + key + ") was found " + value + " times."); 
     //else{ 
} 
+1

'list.keySet()' - 一個列表沒有keySet。地圖呢。你困惑自己嗎? :) – alfasin

+0

對不起,我沒有得到你的想法 – sara

+0

Alfasin是對的。類「List」或「ArrayList」沒有keySet()成員。你的對象名爲「列表」一個「地圖」?地圖有鍵和值。數組,列表,ArrayLists不。 – BuvinJ

回答

1

這是一個更新手級別的「手動」方法。我沒有測試它,但它必須接近...

 // Get sorted Lists of words and counts from the source Map 
    List<String> sortedWordsList = new ArrayList<String>(); 
    List<Integer> sortedCountsList = new ArrayList<Integer>();    
    for(String word : wordCountMap.keySet()) 
    { 
     Integer wordCount = wordCountMap.get(word); 

     int insertIndex=0; 
     for(int i=0; i != sortedCountsList.size(); ++i) 
     { 
      if(wordCount > sortedCountsList.get(i)) break; 
      ++insertIndex; 
     }  
     sortedWordsList.add(insertIndex, word); 
     sortedCountsList.add(insertIndex, wordCount); 
    } 

    // Move top 5 words into a new List 
    final int TOP_WORDS_TO_FIND_COUNT = 5;   
    List<String> topWordsList = new ArrayList<String>(); 
    for(int i=0; i != sortedWordsList.size(); ++i) 
    { 
     topWordsList.add(i, sortedWordsList.get(i)); 
     if(i == TOP_WORDS_TO_FIND_COUNT-1) break; 
    }  

    // Move top 5 counts into a new List 
    List<Integer> topCountsList = new ArrayList<Integer>(); 
    for(int i=0; i != sortedCountsList.size(); ++i) 
    { 
     topCountsList.add(i, sortedCountsList.get(i)); 
     if(i == TOP_WORDS_TO_FIND_COUNT-1) break; 
    }  
+0

但我需要顯示這個詞和它的計數 – sara

+0

行。很簡單。我會添加一個編輯... – BuvinJ

+0

對不起,先生,但我已經有單詞列表和迭代次數。我只需要基於我的詞的變量(鍵)和計數的變量(值)的前5個使用詞的功能。 – sara

1

假設你有存儲在數組中你的話,我首先的話轉移到Map。我相信你正在努力做到這一點,但很難說出你的變量名。完成此操作後,您可以創建一個自定義Comparator,您可以利用它來對Map進行排序。你可以做這樣的事情:

public class Solution {   
    public static void main(String[] args){ 
     String[] words = {"word1", "word1", "word2", "word3", "word4", "word5", "word5"}; 
     Map<String, Integer> wordCounts = new HashMap<>(); 
     for (String word : words){ //Transfer your words to a map 
      if (wordCounts.containsKey(word)){ //If word is already in map, increase value 
       wordCounts.put(word, wordCounts.get(word)+1); 
      }else{ //If word is not in map, add it to the map 
       wordCounts.put(word, 1); 
      } 
     } 
     TreeMap<String, Integer> sortedWordCounts = new TreeMap<>(new ValueComparator(wordCounts)); //Sorts based off of counts 
     sortedWordCounts.putAll(wordCounts); //Add to new map 
     NavigableSet<String> keys = sortedWordCounts.descendingKeySet(); 
     for (int i=0; i<5; i++){ 
      System.out.println(keys.pollLast()); //This prints out the top 5 keys. 
     } 
    } 
} 
class ValueComparator implements Comparator<String>{ 
    private Map<String,Integer> map; 
    public ValueComparator(Map<String,Integer> map){ 
     this.map = map; 
    } 
    @Override 
    public int compare(String o1, String o2) { 
     if (map.get(o1)>=map.get(o2)){ 
      return -1; 
     }else{ 
      return 1; 
     } 
    } 

} 

輸出

word5 
word1 
word4 
word3 
word2 

一個TreeMap是一種類型的Map但排序地圖,你根據你初始化它的Comparator的。如果你不給它Comparator它只會按鍵排序,我們不希望這樣。我們要按值排序,所以您必須編寫自己的Comparator

+0

Upvote在「絕對意義上」爲更好的答案。我的「相對技能水平」答案能否讓我回來? – BuvinJ

相關問題