我正在编写一个递归函数,其目的是迭代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 Entry无法强制转换为java.util.Map
我不知道如何调用我的函数以及如何将Hashmap条目转换为Map
答案 0 :(得分:8)
条目确实不是String
。它是Map.Entry
,因此您可以根据需要将其强制转换为此类型。
然而,自从10年前推出的java 1.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));
}
}
}
答案 1 :(得分:0)
AlexR的答案很好,但就我而言,我需要处理从json反序列化的地图。
所以我需要更多类型的handle(例如:数组,布尔值,数字...)。
这是我的改进版本。
@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);
}
}
}