映射Java的递归迭代

映射Java的递归迭代,java,recursion,map,hashmap,plist,Java,Recursion,Map,Hashmap,Plist,我正在编写一个递归函数,其目的是迭代pList文件。我的代码是 public static void HashMapper(Map lhm1) throws ParseException { //Set<Object> set = jsonObject.keySet(); for (Object entry : lhm1.entrySet()) { if(entry instanceof String) { S

我正在编写一个递归函数,其目的是迭代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
        }
    }
}
publicstaticvoidhashmapper(Map lhm1)抛出ParseException{
//Set=jsonObject.keySet();
for(对象条目:lhm1.entrySet()){
if(字符串的输入实例)
{
System.out.println(entry.toString());
}
其他的
{
HashMapper((Map)((Map)entry).keySet();//获取异常java.util.HashMap$HashMap项不能强制转换为java.util.Map
}
}
}
但是当我调用我的函数“HashMapper((Map)((Map)entry).keySet());”时。我得到了一个例外

无法将java.util.HashMap$HashMap项转换为java.util.Map


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

条目实际上不是
字符串。它是
Map.Entry
,因此如果需要,可以将其转换为此类型

然而,自从10年前引入Java1.5以来,您几乎不需要强制转换。而是使用泛型定义映射,并使用类型安全编程

不幸的是,您的代码不太清楚。您的意思是地图的键或值是
String
?让我们假设key是string,value可以是string或map。(顺便说一句,这是一个非常糟糕的做法,所以我建议你问另外一个问题,你在哪里描述了你的任务,以及如何设计你的程序。)

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

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

    }
}
publicstaticvoidhashmapper(Map lhm1)抛出ParseException{
对于(Map.Entry:lhm1.entrySet()){
String key=entry.getKey();
对象值=entry.getValue();
if(字符串的值实例){
系统输出打印项次(值);
}else if(映射的值实例){
映射子映射=(映射)值;
hashMapper(subMap);
}否则{
抛出新的IllegalArgumentException(String.valueOf(value));
}
}
}

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);
        }
    }
}
@Slf4j
公共类脱敏util{
私有静态void脱敏MapSubprocessor(映射映射、字符串键、对象值){
如果(值==null){
debug(“映射键:{},值:null”,键);
返回;
}
debug(“映射键:{},值:{},值类:{}”,键,值,值.getClass());
if(字符串的值实例| |整数的值实例| |布尔值实例| |双精度值实例){
//您的业务逻辑在这里
}else if(列表的值实例){
列表=(列表)值;
用于(对象:列表){
脱敏映射子处理器(映射、键、对象);
}
}else if(映射的值实例){
试一试{
//未检查
映射子映射=(映射)值;
脱敏图(subMap);
}catch(ClassCastException e){
log.warn(“强制转换映射失败”,e);
}
}否则{
抛出新的IllegalArgumentException(String.valueOf(value));
}
}
公共静态空洞脱敏图(Map图){
对于(Map.Entry:Map.entrySet()){
String key=entry.getKey();
对象值=entry.getValue();
脱敏映射子处理器(映射、键、值);
}
}
}

是使用
Map
而不是
Map
故意或什么?(Map)条目)。keySet()实际上是一个集合。你的方法需要地图。所以它抛出异常并返回一个。。。您不能将其强制转换为
映射
。你想干什么。。。另外,由于同样的原因,字符串的输入实例将永远不会为真。你刚刚完成了我的工作,非常感谢。很好。但实际上,这闻起来是一个糟糕的设计。试着解释你试图解决什么样的任务,也许你会得到如何改进设计的建议。。。这就是为什么我选择用递归来解决它。@ZaidIqbal,递归可能还可以,但在映射中存储不同的类型却不行。我建议您提出另一个问题,在这个问题中,您可以更详细地解释您的任务,建议您的设计解决方案,并征求其他建议。也许你会得到更好的OOD风格的设计方案。谢谢你的建议,我已经改变了我的编码模式,因为你的第一个答案意味着映射到映射,这是解决问题的更好方法