用Java递归编辑半任意嵌套地图

时间:2017-12-17 18:57:01

标签: java dictionary recursion

我正在努力在Java中创建一个能够编辑半任意嵌套Map的递归方法。我需要能够遍历Map,然后编辑和/或删除任意值。这种方法适合更大的应用程序,因此有一些我无法控制的部分。

约束

我在一些限制条件下工作:

  1. 我的方法必须编辑作为参数传入的Map。任何返回值都会被更大的应用程序忽略。
  2. 最大限度地减少内存使用量。传入的数据Map可能很大(超过250 MB)。我需要避免创建它的临时副本。
  3. 对于给定的密钥,可能的值有限:
    • 另一个Map
    • A List
    • 单个值(字符串,布尔值,数字)
  4. 当我浏览Map
  5. 时,我需要跟踪我的位置
  6. 避免ConcurrentModificationException s
  7. 说明性示例代码

    我已经为这个问题编了一个例子。对于这个问题,如果Map返回List(它已被硬编码为适用于一些额外的简化)。首先,这是包含我一直在使用的递归逻辑的类。

    canRemove

    这是一个带有main方法的虚拟类,可用于执行FooModifier以用于说明目的。

    true

    最后,这是虚拟主类使用的虚拟数据文件:

    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    // the Modifier Interface is part of the larger application in which this Class plugs into
    public class FooModifier implements Modifier
    {
       private void recursiveModifier(Map<String, Object> dataMap, String path)
       {
          for (Iterator<Map.Entry<String, Object>> it = dataMap.entrySet().iterator(); it.hasNext();)
          {
             Map.Entry<String, Object> entry = it.next();
             if (entry.getValue() instanceof Map< ? , ? >)
             {
                // recursively call recursiveModifier on entry.getValue(),
                recursiveModifier((Map<String, Object>) entry.getValue(), path + "." + entry.getKey());
             }
             else if (entry.getValue() instanceof List)
             {
                String listPath = path + "." + entry.getKey();
                if (canRemove(listPath))
                {
                   it.remove();
                }
                else
                {
                   // May change modify other types, but not for this example
                }
             }
          }
       }
    
       public void recursiveModifier(Map<String, Object> data)
       {
          // Call private recursive function with data and empty path string
          recursiveModifier(data, "");
       }
    
       @Override
       public void run(Map<String, Object> data)
       {
          recursiveModifier(data);
          // Do other stuff
       }
    
       private boolean canRemove(String listPath)
       {
          // Would perform logic to check if given path can be removed.
          // For this example, just set to true
          return true;
       }
    }
    

    问题

    到目前为止,我提供了我正在使用的内容,但我不确定它是执行此任务的最有效方式。我有兴趣看看是否有更好的方法。

    执行此任务的最佳方式是什么?请解释为什么你的答案是最佳的。

0 个答案:

没有答案