【问题标题】:Remove TreeMap entries less than x删除小于 x 的 TreeMap 条目
【发布时间】:2014-07-19 03:40:51
【问题描述】:

我有以下 TreeMap:

private Map<Date,WeekSchedule> weeks = new TreeMap<Date,WeekSchedule>();

我需要删除所有日期在给定值之前的条目。

最有效的方法是什么?

这是我目前所拥有的:

public void removeWeeksBefore(Date monDate){
    for (Map.Entry<Date, WeekSchedule> entry : weeks.entrySet()){
        if(entry.getKey().before(monDate)){
            weeks.remove(entry.getKey());   //This will destroy the iterator
        }else{
            return;
        }
    }
}

【问题讨论】:

  • Date 是否具有可比性?你能把它存储为NavigableMap吗?
  • @LouisWasserman 是的,Java.util.Date 是可比较的

标签: java map treemap


【解决方案1】:

高效的方法可能是将其存储为SortedMap,然后使用一行

map.headMap(monDate).clear();

【讨论】:

  • 您可以将其存储为TreeMap,当然,但OP 将其存储为Map,不支持headMap。性能将取决于实现,在O(log n) 中肯定有树实现可以支持这一点;不过,我可以很容易地相信 current 实现并不能更快地支持这一点。不过,我不知道为什么您希望迭代在内存中更有效,而且我绝对声称这是专门用作使用 SortedMap 视图类型和问题的预期解决方案的一种方式。
【解决方案2】:

由于你不关心地图值,你只需要遍历keySet

Iterator<Date> iter = weeks.keySet().iterator();

while (iter.hasNext()) {
    if (iter.next().before(monDate))
        iter.remove();
    else
        return;  // since TreeMap is sorted by key
}

【讨论】:

  • 有什么原因,为什么您删除了 else-branch 中的 return-statement?
  • @maja 因为我们不想一发现不需要删除的元素就返回。我们要遍历整个地图。
  • 是的,按自然顺序。
  • @AnubianNoob 好点,我忘了我们正在处理TreeMap。我想我们毕竟可以使用return
【解决方案3】:

如果您要修改Iterable,您可以使用迭代器而不是for-each 循环。

    for (Iterator<Entry<Date, WeekSchedule>> i = weeks.entrySet().iterator() ; i.hasNext(); ){
        Entry<Date, WeekSchedule> entry = i.next();
        if(entry.getKey().before(monDate)){
            i.remove();
        }else{
            return;
        }
    }

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多