一段時間以來,我一直試圖找出解決方案,但在仔細考慮/上網尋找解決方案后,我似乎無法得到任何合適的答案。希望社會能幫幫我!
我有一些字串并希望將它們轉換為嵌套的地圖物件,示例如下。
Fruits.Apple.Red
Fruits.Apple.Green
Fruits.Orange.Yellow
Fruits.Watermelon.Yellow
Fruits.Watermelon.Red
我想把上面的例子轉換成這樣的。
{ Fruits:{
Apple:{
Red: null,
Green: null
},
Orange:{
Yellow: null
},
Watermelon:{enter code here
Yellow: null,
Red: null
}
}
}
如果你覺得這個例子很糟糕,請原諒我。最后一個孩子的值為空是有原因的,我正在嘗試重現我面臨的問題。
uj5u.com熱心網友回復:
addToMap可以實作遞回函式以查找點之前的鍵.作為分隔符,如有必要使用創建映射Map::computeIfAbsent,或將帶null值的鍵添加到頂級映射:
@SuppressWarnings({"rawtypes", "unchecked"})
static void addToMap(String s, Map<String, Map> upperLevel) {
int dotPos = s.indexOf(".");
if (dotPos < 0) {
upperLevel.put(s, null);
} else {
String key = s.substring(0, dotPos);
addToMap(s.substring(dotPos 1), upperLevel.computeIfAbsent(key, k -> new HashMap<>()));
}
}
那么測驗可能如下所示:
String[] arr = {
"Fruits.Cherry",
"Fruits.Apple.Red",
"Fruits.Apple.Green",
"Fruits.Orange.Yellow",
"Fruits.Watermelon.Yellow",
"Fruits.Watermelon.Red",
};
Map<String, Map> result = new HashMap<>();
for (String t : arr) {
addToMap(t, result);
}
System.out.println(result);
輸出:
{Fruits={Apple={Red=null, Green=null}, Cherry=null, Watermelon={Red=null, Yellow=null}, Orange={Yellow=null}}}
如果插入順序很重要,LinkedHashMap則應創建而不是使用HashMap或Supplier<Map>可以使用覆寫的版本:
Supplier<Map> mapSupplier = LinkedHashMap::new;
Map<String, Map> result = mapSupplier.get();
for (String t : arr) {
addToMap(t, result, mapSupplier);
}
System.out.println(result);
@SuppressWarnings({"rawtypes", "unchecked"})
static void addToMap(String s, Map<String, Map> upperLevel, Supplier<Map> mapSupplier) {
int dotPos = s.indexOf(".");
if (dotPos < 0) {
upperLevel.put(s, null);
} else {
String key = s.substring(0, dotPos);
addToMap(s.substring(dotPos 1), upperLevel.computeIfAbsent(key, k -> mapSupplier.get()), mapSupplier);
}
}
輸出(順序已更改):
{Fruits={Cherry=null, Apple={Red=null, Green=null}, Orange={Yellow=null}, Watermelon={Yellow=null, Red=null}}}
uj5u.com熱心網友回復:
- 將字串轉換為映射
- 將字串拆分為陣列(String.split(".") 函式)
- 將陣列轉換為 Map<String,Map<String,Object>:
arrays: ["Fruits","Apple","Red"], ["Fruits","Apple","Green"], ... ->
map: {"Fruits":{"Apple":{"Red":null},{"Green":null}},"Orange":{...},...}}
- 使用 Gson ( https://github.com/google/gson ) 或 Jackson將地圖轉換為 json
Gson gson = new Gson();
return gson.toJson(map);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317670.html
