0

我有一个包含许多条目的 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 没有被删除。事实上,这七个元素都没有被删除。有谁知道为什么?

4

3 回答 3

1

如果成功,TreeMap remove 语句将始终返回对象,如果键不存在则返回 null(假设 null 是无效键),或者抛出异常。见参考 。您是否通过调试验证您实际上是在尝试删除存在的密钥并且您的删除语句正在执行?

于 2013-09-11T19:59:21.363 回答
0

我上面的代码是完全正确的。事实证明,错误完全在其他地方。

于 2013-09-11T22:33:50.927 回答
0

如果您可以分享错误所在的位置会很好吗?

在我的例子中,我希望具有 long as 键的 TreeMap 以相反的顺序排序并实现一个相应的 Comparator(然后我将其传递给构造函数中的 TreeMap)。但由于不能在比较器中使用简单类型“long”,我不得不使用对象类型“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;

虽然不是那么容易找到...

因此,如果您在“删除”不起作用的情况下遇到此类错误,我会先尝试检查您是否使用特殊的比较器并在使用前对比较器进行全面测试。

于 2016-01-19T20:17:38.560 回答