【问题标题】:Iterate over a Map containing List in linear time在线性时间内迭代包含 List 的 Map
【发布时间】:2017-03-21 17:43:19
【问题描述】:

我想遍历Map<Object,List<Object>> 并提取Map.Entry 中的任何对象List<Object>(值)满足特定条件。
我可以看到两种方法:

1) 显而易见的方法是提取条目集并遍历列表(值)。
2) 将此 Map 转换为 Guava 的 MultiMap,循环遍历值,如果满足条件,标记键并从映射中提取实际 List。

我想避免第一种方法,因为它是一种非线性解决方案。还有其他更有效的方法吗?

【问题讨论】:

  • 第一种方法不是线性时间呢?它与对象的总数成线性关系。这两种解决方案是等价的。
  • 我真的不明白为什么 1) 不应该是线性时间。另外,您是否有通过分析发现的性能问题,还是只是猜测?
  • 我认为操作希望避免在循环内循环。鉴于数据的布局,即使不是不可能,也很难
  • >> 这不是非线性的吗? - 不,不会。它将是 O(值的数量)。与 Guava MultiMap 相同。
  • 您绝对必须迭代所有映射条目的所有值。没有办法解决它。任何解决方案都可以做到这一点。接受它并继续前进。

标签: java hashmap multimap


【解决方案1】:

不,如果您必须检查每个值,则必须检查所有值。要遍历所有值,您必须执行以下操作:

public List<Object> getEntriesThatMeetCondition(Map<Object, List<Object>> input) {
    List<Map.Entry> output = new ArrayList<>();

    Iterator it = input.entrySet().iterator();

    while(it.hasNext()) {
        Map.Entry entry = (Map.Entry) it.next();

        List inputList = (List<Object>) entry.getValue();

        for(Object object : inputList) {
            if(meetsCondition(object)) {
                output.add(entry);
            }
        }
    }
}

从某种意义上说,它是线性的,您将遍历每个项目一次。

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 2016-01-12
    • 2021-05-26
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2013-02-04
    相关资源
    最近更新 更多