我有一个包含许多条目的TreeMap。
TreeMap<Long, List<Payment>> myPaymentsForYear;
要从地图中删除第一周,我会
private void removeDaysFromPast() {
for (int i = 0; i < WEEK; i++) {
long key = myPaymentsForYear().firstKey();
myPaymentsForYear.remove(key);
}
System.out.println( "date: " + new Date(myPaymentsForYear.firstKey()).toString());
}
但是,打印的语句始终显示firstKey尚未删除。事实上,七个元素中的非元素被删除。有谁知道为什么?
答案 0 :(得分:1)
如果对象成功,则TreeMap remove语句将始终返回该对象;如果该键不存在,则返回null(假定null是无效键)或抛出异常。 see reference。您是否通过调试验证了您实际上是在尝试删除存在的密钥以及您的remove语句正在执行?
答案 1 :(得分:0)
我上面的代码是完全正确的。事实证明,错误完全在其他地方。
答案 2 :(得分:0)
会很好吗?
在我的例子中,我希望TreeMap具有一个长按键,以相反的顺序排序并实现一个相应的Comparator(然后我将它传递给构造函数中的TreeMap)。但由于简单类型“long”不能在Comparator中使用,我不得不使用对象类型“Long”:
public class LongComparatorInverted implements Comparator<Long> {
@Override
public int compare(Long lhs, Long rhs) {
return (lhs == rhs) ? 0 : (lhs < rhs) ? 1 : -1;
}
当然,Android Studio会在“==”上向您显示警告,但我很遗憾地忽略了它...... 使用“Long”作为对象类型,当然不能保证我在使用TreeMap时比较相同的对象。
所以对我的修正当然是 - 而是使用equals:
return (lhs.equals(rhs)) ? 0 : (lhs < rhs) ? 1 : -1;
虽然不容易找到......
因此,如果您遇到“删除”无效的错误,我会先尝试检查您是否使用特殊的比较器并在使用之前对其进行全面测试。