java で、連想配列を作成したいと考えていますが、連想配列を一つずつ登録する方法は検索できるのですが、複数の連想配列を登録する方法が分かりません。
例えば、PHPで連想配列を作成するには、
$ary = array(); $ary = array('ar1'=>'p1','ar2'=>'p2','ar3'=>'p3');
と複数の連想配列を処理できますが
javaで連想配列を調べていると
Map<String,String> map = new HashMap<>(); map.put('ar1','p1'); map.put('ar2','p2'); map.put('ar3','p3');
のように、連想配列を一つずつput処理するような説明は探せるのですが、phpの処理例のように複数の連想配列を一度に処理する方法が見当たりません。
phpの事例のように、javaで複数の連想配列を一度に処理する記述方法を教えていただけないでしょうか?直接答えが示せない場合には、参考になるサイトなど、何かヒントを頂きたくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
Java9以降であれば、キー・値の組が10組までなら以下の書き方ができます。
java
1Map<String, String> map = Map.of("key1", "value1", "key2", "value2");
10組を超える場合は、Map.Entryを噛ませる必要があるため面倒になります。
import staticをしたほうがいいでしょうね。
これができないということであれば、キー・値の配列をそれぞれ作り、ループ処理するのがせいぜいだと思います。
投稿2020/01/05 00:54
編集2020/01/09 05:07総合スコア20669
0
あまり「PHPと同じように書きたい」という観点だと難しいと思います。
型宣言をきちんとしなければならないし、一定のルールがあります。
もちろんそれっぽい方法がないわけではないです。
例1:匿名クラス
java
1 Map<String, String> map = new HashMap<String, String>() { 2 { 3 put("ar1", "p1"); 4 put("ar2", "p2"); 5 } 6 }; 7 System.out.println(map);
例2:staticイニシャライザ
java
1 private static Map<String, String> map = new HashMap<>(); 2 static { 3 map.put("ar1", "p1"); 4 map.put("ar2", "p2"); 5 } 6 public static void main(String[] args) throws Exception { 7 System.out.println(map); 8 }
などなど。
PHPに近いのは1の方ですかね。
投稿2020/01/05 00:47
総合スコア80875
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/06 07:39
2020/01/06 07:47
0
ベストアンサー
「すでに存在するべつなMapからコピーする」場面を除けば、存在しないかと思います。
MapのインターフェースはJavaで決まっていますが、ここに「複数個のキープと値を追加する」ようなものはありません。
投稿2020/01/05 00:43
総合スコア145975
0
Array2#asMap
自作してみました。配列の要素数が偶数個なら動作しますが、奇数個ならNullPointerExceptionが発生。
Java
1import java.util.Arrays; 2import java.util.ArrayList; 3import java.util.Map; 4import java.util.stream.Collectors; 5import java.util.List; 6import static java.util.AbstractMap.SimpleEntry; 7 8public class Arrays2 { 9 10 private static class Oddth { 11 private boolean odd; 12 public boolean next() {return (odd^=true);} 13 } 14 15 public static <T> Map<T,T> asMap(T... array) { 16 Oddth ordinal = new Oddth(); 17 List<SimpleEntry<T,T>> list = 18 Arrays.asList(array).stream().collect( 19 ArrayList::new, 20 (l,s) -> { 21 if (ordinal.next()) { // 奇数番目 22 l.add(new SimpleEntry<>(s,null)); 23 } else { // 偶数番目 24 l.get(l.size()-1).setValue(s); 25 } 26 }, 27 List::addAll 28 ); 29 return list.stream().collect(Collectors.toMap(SimpleEntry::getKey,SimpleEntry::getValue)); 30 } 31}
自分の実力だとこの程度です。良い方法があればどうぞご提案ください。
new SimpleEntry<>(s,null)に訂正しました。
Array2#asMap第2案(追記)
関数型プログラミングの常套句を使います。引数の配列の要素数が奇数の場合、最後の要素を切り捨てます。
Java
1import java.util.Arrays; 2import java.util.Map; 3import java.util.Stack; 4import java.util.TreeMap; 5import java.util.function.BiConsumer; 6 7public class Arrays2 { 8 9 private static <T> BiConsumer<Map<T,T>,T> memoConsumer() { 10 Stack<T> keyBuff = new Stack<>(); 11 return (m,v) -> { 12 if (keyBuff.isEmpty()) { 13 keyBuff.push(v); 14 } else { 15 m.put(keyBuff.pop(),v); 16 } 17 }; 18 } 19 20 public static <T> Map<T,T> asMap(T... array) { 21 Map<T,T> result = Arrays.asList(array).stream().collect( 22 TreeMap::new, 23 memoConsumer(), 24 Map::putAll 25 ); 26 return result; 27 } 28 29}
投稿2020/01/05 09:03
編集2020/01/06 07:45総合スコア1090
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/05 18:16
2020/01/06 06:27
2020/01/06 08:30 編集
2020/01/06 07:50
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/05 00:56
2020/01/06 07:26