import java.util.*;
public class Main {
@SuppressWarnings("serial")
public static void main
(String[] args
) { final Map
<String, Object
> dates
= new HashMap
<String, Object
>() { {
put
("1999",
new HashMap
<String, Object
>() { {
put
("3",
Arrays.
asList("23",
"24",
"25")); put
("4",
Arrays.
asList("1",
"2",
"3")); }
});
put
("2001",
new HashMap
<String, Object
>() { {
put
("11",
new HashMap
<String, Object
>() { {
put
("7",
Arrays.
asList("23",
"24",
"25")); put
("9",
Arrays.
asList("1",
"2",
"3")); }
});
put("12", "45");
}
});
}
};
final Map
<String, Object
> flattened
= flatten
(dates
); System.
out.
println(flattened
); }
public static Map
<String, Object
> flatten
(final Map
<String, Object
> map
) { return flatten("", map, new HashMap<>());
// use new TreeMap<>() to order map based on key
}
@SuppressWarnings("unchecked")
private static Map
<String, Object
> flatten
(final String key,
final Map
<String, Object
> map,
final Map
<String, Object
> result
) { final Set
<Map.
Entry<String, Object
>> entries
= map.
entrySet(); if (!entries.isEmpty()) {
for (final Map.
Entry<String, Object
> entry
: entries
) { final String currKey
= key
+ (key.
isEmpty() ? "" : '.') + entry.
getKey(); final Object value
= entry.
getValue(); if (value
instanceof Map) { flatten
(currKey,
(Map
<String, Object
>) value, result
); } else if (value
instanceof List) { final List<Object> list = (List<Object>) value;
for (int i = 0, size = list.size(); i < size; i++) {
result.put(currKey + '.' + (i + 1), list.get(i));
}
} else {
result.put(currKey, value);
}
}
}
return result;
}
}
aW1wb3J0IGphdmEudXRpbC4qOwpwdWJsaWMgY2xhc3MgTWFpbiB7CglAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGRhdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkgewogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXQoIjE5OTkiLCBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwdXQoIjMiLCBBcnJheXMuYXNMaXN0KCIyMyIsICIyNCIsICIyNSIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHV0KCI0IiwgQXJyYXlzLmFzTGlzdCgiMSIsICIyIiwgIjMiKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwdXQoIjIwMDEiLCBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwdXQoIjExIiwgbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dCgiNyIsIEFycmF5cy5hc0xpc3QoIjIzIiwgIjI0IiwgIjI1IikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dCgiOSIsIEFycmF5cy5hc0xpc3QoIjEiLCAiMiIsICIzIikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcHV0KCIxMiIsICI0NSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGZsYXR0ZW5lZCA9IGZsYXR0ZW4oZGF0ZXMpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihmbGF0dGVuZWQpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBmbGF0dGVuKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwKSB7CiAgICAgICAgcmV0dXJuIGZsYXR0ZW4oIiIsIG1hcCwgbmV3IEhhc2hNYXA8PigpKTsKICAgICAgICAvLyB1c2UgbmV3IFRyZWVNYXA8PigpIHRvIG9yZGVyIG1hcCBiYXNlZCBvbiBrZXkKICAgIH0KCiAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZmxhdHRlbihmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCwKICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQpIHsKICAgICAgICBmaW5hbCBTZXQ8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cmllcyA9IG1hcC5lbnRyeVNldCgpOwogICAgICAgIGlmICghZW50cmllcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogZW50cmllcykgewogICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGN1cnJLZXkgPSBrZXkgKyAoa2V5LmlzRW1wdHkoKSA/ICIiIDogJy4nKSArIGVudHJ5LmdldEtleSgpOwogICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCkgewogICAgICAgICAgICAgICAgICAgIGZsYXR0ZW4oY3VycktleSwgKE1hcDxTdHJpbmcsIE9iamVjdD4pIHZhbHVlLCByZXN1bHQpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gbGlzdCA9IChMaXN0PE9iamVjdD4pIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gbGlzdC5zaXplKCk7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1dChjdXJyS2V5ICsgJy4nICsgKGkgKyAxKSwgbGlzdC5nZXQoaSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1dChjdXJyS2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KfQ==