我有一台TreeMap
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个位置,我看到了该项。这怎么可能呢?并且在上一次迭代中添加了项。
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;
}发布于 2016-12-21 18:02:45
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中。
发布于 2016-12-21 18:13:22
在TreeMap的Javadoc中,您可以读到:
请注意,与任何排序的映射一样,树映射维护的排序,无论是否提供显式比较器,如果该排序的映射要正确实现映射接口,则必须与equals一致。
由于您没有覆盖equals,因此在您的示例中,比较器与equals不一致。您必须为UserSetting类配备一个equals方法,例如:
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;
}发布于 2016-12-21 19:06:44
Eran在上面的回答中是正确的。您的TreeMap已损坏,因为您正在更新totalMatch。这段代码再现了这个问题。
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;
}
}
}https://stackoverflow.com/questions/41259999
复制相似问题