Java:如何正确返回对象?

时间:2013-10-23 02:03:01

标签: java

好的,所以我一直在做一个学校项目,我正在努力计算不同用户的共同利益。因此,我试图将他们在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);
        }
    });
}

2 个答案:

答案 0 :(得分:0)

Map每个键只能有1个值,这意味着如果多个User得到相同数量的点(即score1.equals(score2)),您将丢失数据(其中一个)来自Map

的用户)

此外,如果您的点数增加,则User两次输入Map后,您可能会多次使用Map

最后,对于Map,使用最终会发生变化的值作为键是一个坏主意。一个关键点的重点是它对于给定的值是恒定的。

我建议您在HashMap中更换密钥和值,事实上,只需使用Multiset(或番石榴List)并保持单独的User Collections.sort()的{​​{1}}并使用Comparator运行MapMap使用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);