HashMapのListに追加するためのショートカット
2023-11-27 21:54:58
質問
私はしばしば、オブジェクトのリストを取得し、オブジェクトに含まれる値に基づいてマップにそれらをグループ化する必要があります。例えば、ユーザーのリストを取り、国によってグループ化します。
このための私のコードは通常次のようになります。
Map<String, List<User>> usersByCountry = new HashMap<String, List<User>>();
for(User user : listOfUsers) {
if(usersByCountry.containsKey(user.getCountry())) {
//Add to existing list
usersByCountry.get(user.getCountry()).add(user);
} else {
//Create new list
List<User> users = new ArrayList<User>(1);
users.add(user);
usersByCountry.put(user.getCountry(), users);
}
}
しかし、これでは不格好で、もっと良い方法を知っている人がいるのではないかと思わずにはいられません。今のところ、私が見ることのできる最も近いものは Google コレクションからの MultiMap .
標準的なアプローチはありますか?
ありがとうございます。
どのように解決するのですか?
Java 8 では
Map#computeIfAbsent()
.
Map<String, List<User>> usersByCountry = new HashMap<>();
for (User user : listOfUsers) {
usersByCountry.computeIfAbsent(user.getCountry(), k -> new ArrayList<>()).add(user);
}
または、Stream APIの
Collectors#groupingBy()
から
List
から
Map
を直接指定します。
Map<String, List<User>> usersByCountry = listOfUsers.stream().collect(Collectors.groupingBy(User::getCountry));
Java7以下では、以下のようなものが最適です。
Map<String, List<User>> usersByCountry = new HashMap<>();
for (User user : listOfUsers) {
List<User> users = usersByCountry.get(user.getCountry());
if (users == null) {
users = new ArrayList<>();
usersByCountry.put(user.getCountry(), users);
}
users.add(user);
}
コモンズ・コレクション
には
LazyMap
がありますが、パラメータ化されていません。
グアバ
には、ある種の
LazyMap
または
LazyList
を使用することができます。
Multimap
で示すように
の回答は以下の通りです。
.
関連
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] HashMapを直接(リテラルに)初期化する方法は?
-
[解決済み] Javaで新しいListを作成する方法
-
[解決済み] ハッシュマップのキーを指定して、値を更新するには?
-
[解決済み] Java Hashmap。値からキーを取得する方法は?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】HashMap、LinkedHashMap、TreeMapの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
javaの非静的メソッドを静的に参照することができない
-
Java の switch case 文で必要な定数式の問題の解決法
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
Uncaught ReferenceError: は定義されていません。
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
無効なメソッド宣言
-
Javaジェネリックを1つの記事で
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
テストが空であるかどうかを判断するためのオプションの処理