0

好的,所以我一直在做一个学校项目,我正在尝试计算不同用户的共同利益。因此,我试图将他们获得的每个共同兴趣的“点”存储在 HashMap 中,然后选择具有最多共同兴趣的用户(最高 HashMap 键)。我已经完成了整数的比较,但是如何返回得分最多的用户?

它读取并加载到列表中的示例 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);
        }
    });
}
4

2 回答 2

0

AMap每个键只能有 1 个值,这意味着如果有多个User获得相同数量的点(即score1.equals(score2)),您将从Map.

此外,如果他们在积分增加User时输入了两次,则您可能会多次使用相同的内容。Map

最后,对于 aMap来说,使用最终会改变的值作为键是一个坏主意。键的全部意义在于它对于给定值是恒定的。

我建议在您Map的. HashMap_ Multiset_ _ (必须是。)ListUserCollections.sort()ComparatorMapMapfinal

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

于 2013-10-23T02:12:33.897 回答
0

一切看起来都不错 - 您只需要返回列表中的最后一个用户!

在方法的末尾添加这一行:

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

以相反的方向排序然后返回第一个元素会更容易:

在比较器中,逆序:

return score2.compareTo(score1);

然后

return users.get0);
于 2013-10-23T04:02:08.563 回答