Map Java 的递归迭代

Posted

技术标签:

【中文标题】Map Java 的递归迭代【英文标题】:Recursive iteration of a Map Java 【发布时间】:2014-06-10 12:18:50 【问题描述】:

我正在编写一个递归函数,其目的是遍历 pList 文件。我的代码是

public static void HashMapper(Map lhm1) throws ParseException 

    //Set<Object> set = jsonObject.keySet();
    for (Object entry : lhm1.entrySet()) 
        if(entry instanceof String)
        
            System.out.println(entry.toString());
        
        else
        
            HashMapper((Map) ((Map) entry).keySet()); //getting Exception java.util.HashMap$HashMap Entry cannot be cast to java.util.Map
        
    

但是当我调用我的函数“HashMapper((Map) ((Map) entry).keySet());”时。我得到了一个例外

java.util.HashMap$HashMap 条目不能转换为 java.util.Map

我不知道如何调用我的函数以及如何将 Hashmap 条目转换为 Map

【问题讨论】:

是故意使用Map 而不是Map&lt;Something&gt; 还是什么? (Map) entry).keySet() 实际上是一个集合。你的方法需要地图。所以它抛出异常 Map#entrySet 返回 Set of Map.Entry ...您不能将其转换为 Map。你想做什么? ...加上entry instanceof String 永远不会因为同样的原因而成立。 【参考方案1】:

条目确实不是String。它是Map.Entry,因此您可以根据需要将其转换为这种类型。

但是自从大约 10 年前引入的 java 1.5 以来,您几乎不需要强制转换。而是使用泛型定义映射并使用类型安全编程。

很遗憾,您的代码不是很清楚。您的意思是您的地图的键或值是String?假设键是字符串,值可以是字符串或映射。 (顺便说一句,这是非常糟糕的做法,所以我建议您在描述您的任务时提出其他问题,并询问如何设计您的程序。)

但无论如何,到目前为止我可以建议你:

public static void hashMapper(Map<String, Object> lhm1) throws ParseException 
    for (Map.Entry<String, Object> entry : lhm1.entrySet()) 
        String key = entry.getKey();
        Object value = entry.getValue();
        if (value instanceof String) 
             System.out.println(value);
         else if (value instanceof Map) 
            Map<String, Object> subMap = (Map<String, Object>)value;
            hashMapper(subMap);
         else 
             throw new IllegalArgumentException(String.valueOf(value));
        

    

【讨论】:

你刚刚完成了我的工作,非常感谢。 没关系。但实际上,这闻起来是一个糟糕的设计。试着解释一下你试图解决什么样的任务,你可能会得到如何改进设计的建议。 我正在尝试编写一个用于解析 Plist 的递归代码...这就是为什么我选择使用递归来解决它。 @ZaidIqbal,递归可能没问题,但是在 map 中存储不同的类型不是。我建议您问另一个问题,在其中更详细地解释您的任务,建议您的设计解决方案并寻求其他建议。可能你会得到更好的OOD风格的设计方案。 感谢您的建议,在您的第一个答案意味着 Map to Map 并且它是解决问题的更好方法之后,我已经更改了我的编码模式【参考方案2】:

AlexR 的回答很好,但就我而言,我需要处理从 json 反序列化的地图。

所以我需要更多类型句柄(例如:数组、布尔值、数字...)。

这是我的改进版。

@Slf4j
public class DesensitizationUtil 

    private static void desensitizationMapSubProcessor(Map<String, Object> map, String key, Object value) 
        if (value == null) 
            log.debug("map key : , value : null", key);
            return;
        
        log.debug("map key : , value : , value class : ", key, value, value.getClass());
        if (value instanceof String || value instanceof Integer || value instanceof Boolean || value instanceof Double) 
            //your business logic here
         else if (value instanceof List) 
            List list = (List) value;
            for (Object object : list) 
                desensitizationMapSubProcessor(map, key, object);
            
         else if (value instanceof Map) 
            try 
                //noinspection unchecked
                Map<String, Object> subMap = (Map<String, Object>) value;
                desensitizationMap(subMap);
             catch (ClassCastException e) 
                log.warn("cast map failed", e);
            
         else 
            throw new IllegalArgumentException(String.valueOf(value));
        
    

    public static void desensitizationMap(Map<String, Object> map) 
        for (Map.Entry<String, Object> entry : map.entrySet()) 
            String key = entry.getKey();
            Object value = entry.getValue();
            desensitizationMapSubProcessor(map, key, value);
        
    

【讨论】:

以上是关于Map Java 的递归迭代的主要内容,如果未能解决你的问题,请参考以下文章

迭代牛顿法到递归(Java)

java 具有递归的迭代解决方案

细说java中Map的两种迭代方式

Java中迭代Map的方法

java中map集合的迭代

二叉树的前中后序遍历(java递归迭代分别实现)