在线性时间内迭代包含List的Map

时间:2017-03-21 17:43:19

标签: java hashmap multimap

我想迭代一个[HttpPost] public IActionResult CreateOrUpdate2(PurchaseOrderItemList[] poItemData) 并提取Map<Object,List<Object>> Map.EntryList<Object>中的任何对象(值)满足某个条件。
我可以看到两种方法:

  

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

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

1 个答案:

答案 0 :(得分:0)

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

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);
            }
        }
    }
}

在某种意义上,它是线性的,因为您只需要浏览一次。