2013-03-08 58 views
0

下面的代碼打印文件中的所有單詞(放在第一個數組中)和第一個數字旁邊的單詞(第二個數組)。如果有一個單詞的重複,它會找到該數組中的單詞(第一個單詞),並將數字1加1,但它仍然會打印出數組中的副本。我只希望單詞的第一個實例旁邊有正確的數字來表示數組中有多少次。我的問題確實是我不希望重複打印出來。 (沒有arraylists plz)。數組中的副本不會被多次打印

while ((in.hasNext())) { 

    l = in.next() ; 

    for(int i = 0; i< Wrd.length-1;i++){ 
     if (l.equals(Wrd[i])){ 
      num[i] = num[i] +1; 
     } 

    } 

    Wrd[n]=l; 
    num[n] = num; 

    n++; 

} 
+0

你可以把這些單詞放在一個集合中嗎?這將不會執行重複操作。 – thegrinner 2013-03-08 16:41:00

+0

@thegrinner沒有抱歉 – user2140783 2013-03-08 16:42:10

回答

1

這聽起來像您無法使用SetMap等等 - 如果你能那麼這裏的其他建議是實現什麼,我會建議:-)

如果你不能因爲某些原因,那麼這個怎麼樣要容易得多:

// capture all the words first into an array 
// the array below is for test purposes 
String[] words = {"1", "2", "3", "5", "1", "1", "3", "4", "1", "5", "7", "0"}; 

Arrays.sort(words); // sort the array - this is vital or the rest wont work 
String last = words[0]; 
int count = 0; 
for (String word : words) { 
    if (word.equals(last)) { 
     count++; 
    } else { 
     System.out.println(last + "=>" + count); 

     count = 1; 
     last = word; 
    } 
} 
System.out.println(last + "=>" + count); 

輸出將是:

0=>1 
1=>4 
2=>1 
3=>2 
4=>1 
5=>2 
7=>1 
+0

這個解決方案完美的肖恩。不幸的是,我花費了太多的時間來試圖解決困難。你的帖子幫了很大忙。謝謝! – Fergus 2017-02-04 23:28:07

0

您需要使用地圖 - 這是自動處理維護一個唯一的單詞列表。如果您重寫put方法來聚合而不是覆蓋,則會自動累加計數。

private void readWords(final Iterator<String> in) { 
    final Map<String, Integer> wordMap = new HashMap<String, Integer>() { 
     @Override 
     public Integer put(String key, Integer value) { 
      final Integer origValue = get(key); 
      if (origValue == null) { 
       return super.put(key, value); 
      } else { 
       return super.put(key, origValue + value); 
      } 
     } 
    }; 
    while (in.hasNext()) { 
     wordMap.put(in.next(), 1); 

    } 
    //just for display - not necessary 
    for (final Entry<String, Integer> entry : wordMap.entrySet()) { 
     System.out.println("Word '" + entry.getKey() + "' appears " + entry.getValue() + " times."); 
    } 
} 

測試:

List<String> strings = new LinkedList<String>(); 
strings.add("one"); 
strings.add("two"); 
strings.add("two"); 
strings.add("three"); 
strings.add("three"); 
strings.add("three"); 
readWords(strings.iterator()); 

輸出:

Word 'two' appears 2 times. 
Word 'one' appears 1 times. 
Word 'three' appears 3 times. 

您可以按字母順序使用TreeMap而非HashMap排序的話 - 這可能會尋找更好的顯示;取決於你打算如何處理地圖。

0

跟蹤如果給定的字是用一個布爾標誌重複的,如果它不將其添加到陣列中:

while (in.hasNext()) { 
    boolean dup = false; 
    l = in.next() ; 

    for(int i = 0; i< Wrd.length-1;i++){ 
     if (l.equals(Wrd[i])){ 
      num[i] = num[i] +1; 
      dup = true; 
      break; // No reason to check the rest of the array 
     } 
    } 

    if (!dup) { 
     Wrd[n] = l; 
     num[n] = num; // If you're looking for frequency, you probably want 1 not num 

     n++; // only increment the index if we add a new word 
    } 
}