2

HashMap<String, Object>.toString()を呼び出すと、次のようになります。

{somekey=false, anotherKey=someString, thirdKey={nestedKey=hello, nestedKey2=world,etc=etcetcetc}}

スクリプトのある時点で、独自のマップとして設定された「thirdKey」を繰り返し処理したいと思います。「ネストされた」HashMapを分離し、それを独自の1次元マップとして使用するために使用される一般的な規則はありますか?

4

4 に答える 4

6

これが、マップ(およびこれらのマップ内のマップ)からすべての値を再帰的に抽出するための私のコードです。

public List<Object> getValues(Map<String, Object> map) {

    List<Object> retVal = new ArrayList<Object>();

    for (Map.Entry<String, Object> entry : map.entrySet()) {
        Object value = entry.getValue();

        if (value instanceof Map) {
            retVal.addAll(getValues((Map) value));
        } else {
            retVal.add(value);
        }
    }

    return retVal;
}

ヴィクドールがすでに言ったように、これには本当の慣習はないと思います。

編集: もちろん、キーと値を新しいマップに書き込む(「フラット化」する)こともできます。ネストされたマップの1つが既存のキーを使用している場合に問題が発生しないため、値をリストに追加しました。

于 2012-08-27T14:15:18.117 に答える
3

私が知っている慣習はありません。instanceofキーの値がであるかどうかを確認するためにフォールバックする必要がありMap、そうである場合は特別に処理する必要があります。この場合は再帰的に処理します。

于 2012-08-27T14:13:43.630 に答える
1

ジェネリックスが導入された「一般的な慣習」があるかどうかは疑問です。強く型付けされたプログラムに移行し、オブジェクトをハッシュマップのキーまたは値として使用しないことをお勧めします。そうすれば、このシナリオは発生せず、より組織化されたデータ定義が得られます。私の2セント!

于 2012-08-27T14:10:43.260 に答える
0
public static Map<String, Object> flatten(Map<String, Object> map) {
    Map<String, Object> newMap = new HashMap<>();
    for (Entry<String, Object> entry : map.entrySet()) {
        if (entry.getValue() instanceof Map) {
            @SuppressWarnings("unchecked")
            Map<String, Object> tempMap = flatten((HashMap<String, Object>) entry.getValue());
            for (Entry<String, Object> tempEntry : tempMap.entrySet()) {
                newMap.put(entry.getKey()+"."+tempEntry.getKey(), tempEntry.getValue());
            }
        } else {
            newMap.put(entry.getKey(), entry.getValue());
        }
    }
    return newMap;
}
于 2017-07-21T09:33:25.840 に答える