0

私は HashMap を持っていて、次のように繰り返しています:

for(HashMap<String, Integer> aString : value){
                System.out.println("key : " + key + " value : " + aString);

            }

次のような結果が得られます。

key : My Name value : {SKI=7, COR=13, IN=30}

`SKI 、 COR 、および IN を、対応する値を持つ 3 つの異なる ArrayLists に分離する必要がありますか? どうやってするか?

4

4 に答える 4

0

データが常に JSON である場合は、JSON を通常使用する場合と同じように簡単にデコードできます。

ArrayList<Integer> array = new ArrayList<Integer>();
JSONArray json = new JSONArray(aString);
for (int i =0; i< json.length(); i++) {
    array.add(json.getInt(i));
}
于 2013-02-08T13:25:42.427 に答える
0

コードが非常に短いため、ハッシュマップに何が含まれているかはよくわかりませんが、ハッシュマップの toString() を提供しているように見えます。ハッシュマップを反復処理する最良の方法は次のとおりです。

    Map mp;
    .....
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        System.out.println(pairs.getKey() + " = " + pairs.getValue());
        String key = pairs.getKey();
        String value = pairs.getValue();
        //Do something with the key/value pair
    }

ただし、ハッシュマップを正しく反復処理している場合は、その文字列を手動で 3 つの異なる配列リストに解析するソリューションを以下に示します。これがおそらく最も安全な方法です。

ArrayList < String > ski = new ArrayList < String > ();
ArrayList < String > cor = new ArrayList < String > ();
ArrayList < String > in = new ArrayList < String > ();

for (HashMap < String, Integer > aString: value) {
    System.out.println("key : " + key + " value : " + aString);
    aString.replace("{", "");
    aString.replace("}", "");
    String[] items = aString.split(", ");
    for (String str: items) {
        if (str.contains("SKI")) {
            String skiPart = str.split("=");
            if (skiPart.length == 2) ski.add(skiPart[1]);
        }
        elseif(str.contains("COR")) {
            String corPart = str.split("=");
            if (corPart.length == 2) cor.add(corPart[1]);
        }
        elseif(str.contains("IN")) {
            String inPart = str.split("=");
            if (inPart.length == 2) in.add(inPart[1]);
        }
    }

}
于 2013-02-08T16:59:40.297 に答える
0

期待される出力の形状が明確ではありません。

次のような 3 つのリスト:

[7]
[13]
[30]

または、次のようなキーから 3 つのリストへのマッピング:

{ "SKI" -> [7]  }
{ "COR" -> [13] }
{ "IN"  -> [7]  }

?

それにもかかわらず、ここにいくつかのオプションがあります:

オプション1

// HashMap does not preserve order of entries
HashMap<String, Integer> map = new HashMap<>();
map.put("SKI", 7);
map.put("COR", 13);
map.put("IN", 30);

List<List<Integer>> listOfLists = map.values()
                                     .stream()
                                     .map(Collections::singletonList)
                                     .collect(Collectors.toList());

listOfLists.forEach(System.out::println);
Output:
[7]
[30]
[13]

オプション 2

// LinkedHashMap preserves order of entries
LinkedHashMap<String, Integer> map2 = new LinkedHashMap<>();
map2.put("SKI", 7);
map2.put("COR", 13);
map2.put("IN", 30);

List<List<Integer>> listOfLists2 = map2.values()
                                       .stream()
                                       .map(Collections::singletonList)
                                       .collect(Collectors.toList());

listOfLists2.forEach(System.out::println);
Output:
[7]
[13]
[30]

オプション 3

HashMap<String, Integer> map3 = new HashMap<>();
map3.put("SKI", 7);
map3.put("COR", 13);
map3.put("IN", 30);

HashMap<String, List<Integer>> result = new HashMap<>();
map3.forEach((key, value) -> result.put(key, Collections.singletonList(value)));

result.entrySet().forEach(System.out::println);
Output:
SKI=[7]
IN=[30]
COR=[13]

オプション 4

Map<String, List<Integer>> result =
        map4.entrySet()
            .stream()
            .collect(Collectors.toMap(
                    // key mapping
                    entry -> entry.getKey(),
                    // value mapping
                    entry -> Collections.singletonList(entry.getValue())
                    )
            );

result.forEach((key, val) -> System.out.println(key + " " + val));
Output:
SKI [7]
IN [30]
COR [13]
于 2019-05-18T08:57:37.263 に答える