🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

823閲覧

java 連想配列に関して

old_dog

総合スコア51

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

0クリップ

投稿2020/01/05 00:36

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で複数の連想配列を一度に処理する記述方法を教えていただけないでしょうか?直接答えが示せない場合には、参考になるサイトなど、何かヒントを頂きたくお願いいたします。

swordone👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2020/01/05 00:56

ただし、この書き方で生成したMapは変更不可になります。あとでさらに追加したり変更したりする場合は、作成したMapをHashMapなどのコンストラクタに渡して別のMapを生成して使うことになります。
old_dog

2020/01/06 07:26

swordone様、貴重なお時間を下さいましてありがとうございました。Map.of関数は使えないようです。androidStudioで作成してますので、versionが足りないのかもしれません。他のコメントにもアドバイスを頂いており心から感謝いたします。ありがとうございます。
guest

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

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

old_dog

2020/01/06 07:36

m.ts10806様、いつもありがとうございます。貴重なお時間を頂きましてありがとうございました。javaでの連想配列の取り扱いでは、素直に一つ一つ登録した方が可読性が保たれるように感じられました。いつも丁寧にご説明ご説明頂き、また美しいコードもご教授頂き感謝をいたしております。心からお礼申し上げます。今後ともよろしくお願いいたします。
m.ts10806

2020/01/06 07:39

コード自体は検索して引っ掛かったものを使ったのでそこまでキレイでもないと思います。 大事なのは「言語には言語のお作法があり、別の言語と同じように表現したいという願いは大抵叶わない」というところですね。 同じ結果にはできますが、同じようなコードにはなりません。
old_dog

2020/01/06 07:47

m.ts10806様、ありがとうございます。私はまだ初心者で亀のような歩みなのですが、今の初心者レベルで「他の言語と同じように表現したいという願いは大抵叶わない」という認識を得られたことに幸運を感じました。今後学習を進めていくうえで、何度も思い出す価値のあるフレーズとなるのでしょう。本当にありがとうございました。
guest

0

ベストアンサー

「すでに存在するべつなMapからコピーする」場面を除けば、存在しないかと思います。

MapのインターフェースはJavaで決まっていますが、ここに「複数個のキープと値を追加する」ようなものはありません。

投稿2020/01/05 00:43

maisumakun

総合スコア145975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

old_dog

2020/01/06 07:41

maisumakun様、いつもアドバイスをありがとうございます。この度も貴重なお時間をありがとうございました。リンク先を読ませていただきました。ご教授頂きましたように「複数のキー、値を追加する」というようなメソッドは確認できませんでした。適切なアドバイスをありがとうございました。皆様が教えてくださるように一つ一つ丁寧に登録するようにいたします。今回もありがとうございますた。今後ともよろしくお願いいたします。
guest

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
xebme

総合スコア1090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2020/01/05 18:16

この処理はStreamよりは普通にforループでやったほうがいいです。
old_dog

2020/01/06 06:27

xebme様、貴重なお時間に連想配列を作る自作関数をご提供くださり感謝です。また、とてもびっくりしました。なければ自作するというくらい、私も勉強を進められたらと、とても刺激になりました。ありがとうございました。
xebme

2020/01/06 08:30 編集

>swordoneさん ありがとうございます。そのひとことですっきりしました。結局、関数型プログラミングの常套句を使うことにしました。 >old_dogさん いつのまにか解決済みになっていましたが、第2案を追記して終わります。<- 解決済みは間違いです。
old_dog

2020/01/06 07:50

xebme様、ありがとうございます。頂きましたコードを読解しながら打ち込んでみたのですが、読解に時間がかかっています。使い方を理解できるまで更に時間がかかりますが、ちゃんと理解して使えるようにチャレンジします。先にお礼になってしまいましたが、今後ともよろしくお願いします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問