Eran is right in his answer above. Your TreeMap is broken because you are updating totalMatch. This code reproduces the problem.
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;
}
}
}