2013-10-23 69 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);