7

ここで初めてなので、これが理にかなっていることを願っています!

キーとして文字列を含み、値として文字列のリストを含むマップがあります。マップ内の各リストに含まれるすべてのvlauを繰り返す必要があります。

したがって、最初にキーを取得したいと思います。これは機能します。

Set<String> keys = theMap.keySet();

これにより、すべてのキーを含むセットが返されます。素晴らしい :)

これは私が行き詰まっているところです-Web上のほとんどの情報は、キーから返される値が単純な文字列または整数であり、別のセット、この場合はリストではないと想定しているようです。試しtheMap.values()ましたが、うまくいきませんでした。forloop/ for:eachloopを試しましたが、どちらもうまくいきませんでした。

ありがとうございます!

4

4 に答える 4

24
for(List<String> valueList : map.values()) {
  for(String value : valueList) {
    ...
  }
}

それは本当にそれを行うための「通常の」方法です。または、キーも必要な場合は...

for(Map.Entry<String, List<String>> entry : map.entrySet()) {
  String key = entry.getKey();
  for (String value : entry.getValue()) {
    ...
  }
}

とは言うものの、オプションがある場合は、Guava ListMultimapに興味があるかもしれません。これは、によく似ていますが、求めているものとまったく同じように機能し、すべての値を「フラット化」するMap<K, List<V>>など、より多くの機能を備えています。Collection<V> values()マルチマップで1つのコレクションに。(開示:私はグアバに貢献します。)

于 2012-04-09T15:52:04.123 に答える
8

高速であるため、繰り返し処理することをお勧めしMap.entrySet()ます(1つのステップで、キーと値の両方が見つかります)。

Map<String, List<String>> m = Collections.singletonMap(
    "list1", Arrays.asList("s1", "s2", "s3"));

for (Map.Entry<String, List<String>> me : m.entrySet()) {
  String key = me.getKey();
  List<String> valueList = me.getValue();
  System.out.println("Key: " + key);
  System.out.print("Values: ");
  for (String s : valueList) {
    System.out.print(s + " ");
  }
}

または、Java 8 API(Lambda関数)を使用して同じです。

m.entrySet().forEach(me -> {
    System.out.println("Key: " + me.getKey());
    System.out.print("Values: ");
    me.getValue().forEach(s -> System.out.print(s + " "));
});

または、JavaStreamAPIマッピングのハードコアとメソッドリファレンスを少し使用します:-)

m.entrySet().stream().map(me -> {
    return "Key: " + me.getKey() + "\n"
        + "Values: " + me.getValue().stream()
            .collect(Collectors.joining(" "));
    })
    .forEach(System.out::print);

そして、出力は、予想どおり、次のようになります。

キー:list1
値:s1 s2 s3
于 2012-04-09T16:02:17.547 に答える
0

あなたには必要だMap<String, List<String>>

左側Stringがキー、右側List<String>が値であり、この場合はListsStringの値です。

于 2012-04-09T15:52:29.077 に答える
0

Java 8 API(ラムダ関数)を使用した別の例。
繰り返したい場合:

Map<String, List<String>> theMap = new HashMap<>();

theMap.forEach((key, value) -> {
       System.out.println("KEY: " + key);
       System.out.print("VALUES: ");
       value.forEach(System.out::println);
});
于 2022-02-11T10:00:56.210 に答える