首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java TreeMap故障

Java TreeMap故障
EN

Stack Overflow用户
提问于 2016-12-21 18:00:56
回答 3查看 63关注 0票数 0

我有一台TreeMap

代码语言:javascript
复制
final Map<UserSetting, ItemsIntersectionAndComplement> _usersSimilar = new TreeMap<UserSetting, ItemsIntersectionAndComplement>(new Comparator<UserSetting>() {

@Override
public int compare(UserSetting lhs, UserSetting rhs) {

int prec = (lhs.id()).compareTo(rhs.id());
return lhs.totalMatch > rhs.totalMatch ? -1 : (lhs.totalMatch < rhs.totalMatch ) ? 1 : prec;
}
});

当检查key是否存在时,它会返回false,但在特定的第n个位置,我看到了该项。这怎么可能呢?并且在上一次迭代中添加了项。

代码语言:javascript
复制
if (!_usersSimilar.containsKey(rating2.userSetting())) { // <-- CHECKING HERE EXISTENCE

    ItemsIntersectionAndComplement iiac = new ItemsIntersectionAndComplement();
    iiac.intersection.add(rating2.item());
    rating2.userSetting().totalMatch = 1;
    _usersSimilar.put(rating2.userSetting(), iiac);
} else {
  //.. SOME CODE, BUT CALL DOES NOT REACH IT
}

public class UserSetting extends _UserSetting {
    public UserSetting() {
    }

    int totalMatch;
}
EN

回答 3

Stack Overflow用户

发布于 2016-12-21 18:02:45

代码语言:javascript
复制
if (!_usersSimilar.containsKey(rating2.userSetting())) { // <-- CHECKING HERE EXISTENCE

    ItemsIntersectionAndComplement iiac = new ItemsIntersectionAndComplement();
    iiac.intersection.add(rating2.item());
    rating2.userSetting().totalMatch = 1;
    _usersSimilar.put(rating2.userSetting(), iiac);
}

您在映射中搜索的键和您放入映射中的键具有不同的状态,因为您要在if子句中更新rating2.userSetting().totalMatch

因此,您正在搜索的键很可能不存在于Map中,但是您要添加的键存在于Map中。

票数 3
EN

Stack Overflow用户

发布于 2016-12-21 18:13:22

TreeMap的Javadoc中,您可以读到:

请注意,与任何排序的映射一样,树映射维护的排序,无论是否提供显式比较器,如果该排序的映射要正确实现映射接口,则必须与equals一致。

由于您没有覆盖equals,因此在您的示例中,比较器与equals不一致。您必须为UserSetting类配备一个equals方法,例如:

代码语言:javascript
复制
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (!(o instanceof UserSetting)) {
        return false;
    }
    UserSetting s = (UserSetting)o;
    return id == s.id && totalMatch = s.totalMatch;
}
票数 1
EN

Stack Overflow用户

发布于 2016-12-21 19:06:44

Eran在上面的回答中是正确的。您的TreeMap已损坏,因为您正在更新totalMatch。这段代码再现了这个问题。

代码语言:javascript
复制
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

public class HashMapWithComparatorTest {
    public static void main(String[] args) {
        final Map<UserSetting, String> _usersSimilar = new TreeMap<UserSetting, String>(new Comparator<UserSetting>() {

            @Override
            public int compare(UserSetting lhs, UserSetting rhs) {

                int prec = (lhs.id()).compareTo(rhs.id());
                return lhs.totalMatch > rhs.totalMatch ? -1 : (lhs.totalMatch < rhs.totalMatch ) ? 1 : prec;
            }
        });

        UserSetting setting1 = new UserSetting(2, 1);
        UserSetting setting2 = new UserSetting(3, 1);
        UserSetting setting3 = new UserSetting(1, 1);
        UserSetting setting4 = new UserSetting(1, 1);
        UserSetting setting5 = new UserSetting(2, 2);

        _usersSimilar.put(setting1, "test");
        _usersSimilar.put(setting2, "test");
        _usersSimilar.put(setting3, "test");
        _usersSimilar.put(setting4, "test");


        System.out.println("Before touching totalMatch:");
        System.out.println(_usersSimilar.containsKey(setting1));
        System.out.println(_usersSimilar.containsKey(setting2));
        System.out.println(_usersSimilar.containsKey(setting3));
        System.out.println(_usersSimilar.containsKey(setting4));
        System.out.println(_usersSimilar.containsKey(setting5));

        setting1.totalMatch++;
        setting1.totalMatch++;

        setting2.totalMatch--;
        setting2.totalMatch--;

        setting3.totalMatch++;
        setting3.totalMatch++;

        setting4.totalMatch--;
        setting4.totalMatch--;

        setting5.totalMatch++;
        setting5.totalMatch++;

        System.out.println("After changing totalMatch:");
        System.out.println(_usersSimilar.containsKey(setting1));
        System.out.println(_usersSimilar.containsKey(setting2));
        System.out.println(_usersSimilar.containsKey(setting3));
        System.out.println(_usersSimilar.containsKey(setting4));
        System.out.println(_usersSimilar.containsKey(setting5));
    }

    private static class UserSetting {
        private int id;
        public int totalMatch;

        public Integer id() {
            return id;
        }

        public UserSetting(int id, int totalMatch) {
            this.id = id;
            this.totalMatch = totalMatch;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41259999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档