好的,所以我一直在做一个学校项目,我正在努力计算不同用户的共同利益。因此,我试图将他们在HashMap中获得的“点”存储为他们所拥有的每个共同兴趣,然后选择具有最大共同兴趣的用户(最高HashMap键)。我对完成的整数进行了比较,但是如何以最高点返回用户?
它读取的示例TXT文件并加载到List:
丹尼尔: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 :(得分:0)
Map
每个键只能有1个值,这意味着如果多个User
得到相同数量的点(即score1.equals(score2)
),您将丢失数据(其中一个)来自Map
。
此外,如果您的点数增加,则User
两次输入Map
后,您可能会多次使用Map
。
最后,对于Map
,使用最终会发生变化的值作为键是一个坏主意。一个关键点的重点是它对于给定的值是恒定的。
我建议您在HashMap
中更换密钥和值,事实上,只需使用Multiset
(或番石榴List
)并保持单独的User
Collections.sort()
的{{1}}并使用Comparator
运行Map
,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);
}
});
必须是User
。)
users.get(0)
最后,使用users.get(0)
返回得分最高的score1.compareTo(score2)
。
注意:如果score2.compareTo(score1)
成为得分最低的用户,则只需在Comparator
中与{{1}}交换{{1}}。
答案 1 :(得分:0)
一切看起来都很好 - 你只需要返回列表中的最后一个用户!
在方法的末尾添加此行:
return users.get(users.size() - 1);
可以更容易地向相反方向排序然后返回第一个元素:
在比较器中,按顺序颠倒:
return score2.compareTo(score1);
然后
return users.get0);