2013-10-23 100 views
0

好的,所以我一直在做一個學校的項目,我試圖計算不同用戶的共同興趣。因此,我試圖將他們獲得的「分數」存儲在HashMap中,以獲得他們每個共同的興趣,然後選擇最感興趣的用戶(最高HashMap鍵)。我已經完成了整數的比較,但如何返回用戶最多的點數?Java:如何正確返回對象?

例TXT文件,它讀取來自與加載到列表:

丹尼爾:adcbadcbd

麥:abdcbdcab

 public User getMutualUser(User user) { 
    final Map<User, Integer> points = new HashMap<User, Integer>(); 
    for(User u : users) { 
     if(u.getName().equals(user.getName())) continue; 
     for(int i = 0; i < u.getAnswers().size(); i++) { 
      if(u.getAnswers().get(i).equals(user.getAnswers().get(i))) { 
       System.out.println(u.getName() + " - " + u.getAnswers().get(i)); 
       int current = points.get(u); 
       points.put(u, current + 1); 
      } 
     } 
    } 
    Collections.sort(users, new Comparator<User>() { 
     public int compare(User u1, User u2) { 
      Integer score1 = points.get(u1); 
      Integer score2 = points.get(u2); 
      return score1.compareTo(score2); 
     } 
    }); 
} 

回答

0

Map只能有每個鍵1個值,這意味着如果有更多的比一個User得到相同的點數(即score1.equals(score2)),您將從Map中丟失數據(其中一個用戶)。

此外,如果兩個點的點數遞增,則可能會多次輸入Map兩次,因此您可能會多次使用User

最後,對於Map,使用作爲關鍵字的值最終會改變是個壞主意。一個關鍵點的全部要點是它對於一個給定的值是不變的。

我建議你Map左右交換的關鍵和價值觀,其實只是用HashMap(或番石榴Multiset),並保持User個獨立的List並使用它使用Map作爲Comparator運行Collections.sort()查找。 (該Map將不得不final。)

List<User> users = new ArrayList<User>(); 
final Map<User, Integer> points = new HashMap<User, Integer>(); // assumes User has hashcode()/equals() defined 
for(User u : users) { 
    // populate the points Map 
} 
Collections.sort(users, new Comparator<User>() { 
    public int compare(User u1, User u2) { 
     Integer score1 = points.get(u1); 
     Integer score2 = points.get(u2); 
     return score1.compareTo(score2); 
    } 
}); 

最後,users.get(0)返回你的得分最高User

注:如果users.get(0)原來是得分最低的用戶,只需換score1.compareTo(score2)Comparatorscore2.compareTo(score1)

+1

你應該在你的開篇中澄清一下這個語言。說一個'Map'只能有「每個值1個鍵」是一個倒退。地圖只能有「每個KEY1個值」。你還應該指出,就'map'而言,如果'score1.equals(score2)'的關鍵是相同的。 – vpiTriumph

+0

非常感謝,但最終我應該如何返回用戶? – Compressions

+0

謝謝。我根據這些評論編輯了答案。 – Stewart

0

一切看起來不錯 - 你只需要返回列表中的最後一個用戶!

在你的方法結束時添加這一行:

return users.get(users.size() - 1); 

它可以在相反的方向更容易進行排序然後返回第一元件:

在比較器,相反順序:

return score2.compareTo(score1); 

然後

return users.get0);