質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

4回答

15702閲覧

MAPのkeyとvalueに、それぞれ異なる型を持つ同じ要素数のListを格納したいです。

kemi

総合スコア7

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2016/01/23 20:25

編集2016/01/24 05:16

初投稿失礼します。

現在Eclipseでjavaを書いているのですが、Mapについて質問があります。

" List<Integer> A " と " List<List<String>> B " を用いて " Map<Integer, List<String>> C "を作成したいと考えています。

また、それぞれのAとBは先頭から順番に一対一の関係(Aの一つ目の要素はBの一つ目のリスト要素,Aの二つ目の要素はBの二つ目のリスト要素...)としたいです。

何卒、宜しくお願い致します。

///追加******///
上記の内容に関して、keyとvalueを逆にしたMap<List<String>, Integer>を作成したいと考えております。

具体的には、各List<String>の文字列集合のリストに対し、int型の重みをつけたいと考えています。

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

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

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

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

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

kozuchi

2016/01/23 22:20

確認です。「それぞれ異なる型を持つ同じ要素数のListを格納する」ということなら、 「 Map<Integer, List<String>> C 」ではなく、 「Map<List<Integer>, List<String>> C」ではないですか?
GikgeStephano

2016/01/23 22:43

この子はmapでたくさんのエレメントがセイブできることが分からないかもしれません
shanxia

2016/01/24 02:25

keyをListにすることは滅多に無いことなので、何か勘違いしているかもしれません。具体的にやりたいことを書いてくれれば、他のやり方を提示できる可能性があります。
kemi

2016/01/24 04:57

ご回答ありがとうございます。 質問の文章が分かりづらく申し訳ありません。 List<Integer> Aと、List<List<String>>Bを使い 最終的に、Map<Integer, List<String>>の形にしたいと考えています。 質問のほうを編集させていただきました。 何卒宜しくお願いいたします。
guest

回答4

0

ベストアンサー

AとBの要素数が違っていた場合にどうするのか未定ですが。

java

1Map<Integer, List<String>> C = new HashMap<>(); 2for (int i = 0; i < A.size(); i++) { 3 C.put(A.get(i), B.get(i)); 4}

こんな感じではいかがでしょうか?
「Aが1の時は、Bのこの値」といった条件があるならば、put前にAの値を取り出して、Bの値を検索すれば良いと思います。

追加質問ですが、AとBの要素の順序が、そのまま対応付いているならば、下記の様にしてはいかがでしょうか。

java

1Map<List<String>,Integer> C = new LinkedHashMap<>(); 2for (int i = 0; i < A.size(); i++) { 3 C.put(B.get(i), A.get(i)); 4}

LinkedHashMapを使うのは、後から利用するときに、キーがList<String>だと検索しづらいから、要素番号を保たせています。

投稿2016/01/24 05:12

編集2016/01/24 05:23
shanxia

総合スコア1038

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

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

kemi

2016/01/24 05:25

早速のご回答ありがとうございます。 上記のように実装したところ、下記のようなエラーが表示されてしまいました。 The method put(List<String>, Integer) in the type Map<List<String>,Integer> is not applicable for the arguments
shanxia

2016/01/24 05:27

AとBの変数宣言は何にしていますか?
kemi

2016/01/24 05:40

class Insta_Set{ //タグ集合です public List<String> itemset; //コンストラクタです public Insta_Set(List<String> itemset) { this.itemset = new LinkedList<String>(itemset); } //タグリストを返す public List<String> getItemset(){ return itemset; } ・・・・ ・・・・ public static void main(String[] args) { String inFile = "xxx.txt"; List<Insta_Set> dataset = readData(inFile," "); // データの読み込み,タグ List<Integer> likes = readDataLikes(inFile," "); // データの読み込み,重み Map<List<String>, Integer> insta = new HashMap<List<String>, Integer>(); for (int i = 0; i < dataset.size(); i++) { insta.put(dataset.get(i), likes.get(i)); //Error } } } 具体的なソースコードは上記のようになっております。 それぞれ、List<InstaSet>型と、List<Integer>型です。
shanxia

2016/01/24 05:44

AはList<String>では無く、List<Insta_Set>なのですね。それならば、 Map<List<Insta_Set>, Integer> insta = new HashMap<List<Insta_Set>, Integer>() と宣言しなければいけません。
kemi

2016/01/24 16:21

すみません、宣言方法間違えていたのですね、、 ご指摘ありがとうございます!
guest

0

また、それぞれのAとBは先頭から順番に一対一の関係(Aの一つ目の要素はBの一つ目の要素,Aの二つ目の要素はBの二つ目の要素...)としたいです。

2つのListを、順番を維持しながら対応関係を持たせるという意味でしょうか。
だとすれば、Mapの実装型の一つLinkedHashMapが有効かと思われます。
これは、データをputした順番に並べた状態でマッピングします。
(ただし、通常のMap同様、keyが重複すると上書きされる。その場合、上書きされる前の順番は変わらない)
通常のHashMapでは順番については保証されませんが、このクラスはentrySet()でエントリービューを取得した場合などにもこの挿入順が維持されます。

Java

1//このようなリストが先に存在しているとする 2List<Integer> a; 3List<String> b; 4 5Map<Integer, String> map = new LinkedHashMap<Integer, String>(); 6for(int i = 0; i < a.size(); i++){ 7 map.put(a.get(i), b.get(i)); 8}

keyとなるIntegerに重複があるというのなら、そもそもMapを使うのが適当ではないということになります。
intとList<String>をメンバに持つクラスを作ったほうがいいのではないでしょうか?

投稿2016/01/24 01:12

編集2016/01/24 05:05
swordone

総合スコア20651

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

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

kemi

2016/01/24 04:50

> 2つのListを、順番を維持しながら対応関係を持たせるという意味でしょうか。 おっしゃる通りです。 LinkedHashMapだとkeyが重複すると上書きされてしまうのですね。。 ありがとうございます。
swordone

2016/01/24 04:56

LinkedHashMapにかぎらず、Mapは同一のkeyを一つしか持てません。 なので、同じkeyに対して値を登録しようとすると上書きされます。
kemi

2016/01/24 05:04

早速のお返事ありがとうございます。 > LinkedHashMapにかぎらず、Mapは同一のkeyを一つしか持てません。 すみません、この指摘に関しては勉強不足でした。 今回の状況で同一のkeyが存在する場合に対してそれぞれにListを持たせたい場合は、mapが使えないということですね。。 ありがとうございます。
kemi

2016/01/24 05:11

keyとvalueを逆にして、Map<List<String>, Integer>で考えてみたいと思います。 ありとうございました。
swordone

2016/01/24 05:16

そもそもMapにしてどう使いたいのでしょうか? そこの議論なしにMapを使おうとするのは良くないのですが。 Mapはある値を鍵にして別の値を格納する仕組みで、基本的に鍵を使って値を取り出したりすることを想定しています。 鍵がList型だと、取り出すための鍵を作るのが手間なうえ、Listの内容が変更されるとMapが正常な動作をしなくなります。 具体的に何をどうしたいのかをもう一度整理してください。
kemi

2016/01/24 05:33

質問内容が乏しく失礼致しました。 具体的には、twitter等のユーザーの1投稿に対するタグ情報(List<String>)に対し、その重みをつけmapに格納するということを数投稿分行いたいと考えております。 そのため、Listの内容が変更されるという場合は考えておりません。
swordone

2016/01/24 05:37

であれば、「何かを鍵に別の値を登録する」という性質のMapでは適さないという事になります。 Listと重みの対で管理するという発送なら、やはりその2つをメンバに持つクラスを作ったほうがいいです。
kemi

2016/01/24 05:42

>Listと重みの対で管理するという発送なら、やはりその2つをメンバに持つクラスを作ったほうがいいです 新しくクラスを作成するという発想は思いつかなかったです。ありがとうございます。
guest

0

まあ、その「AとBは先頭から順番に一対一の関係」なら、Map<String,Integer>でいいのと思います。Mapとは一つのエレメントではない、たくさんのエレメントの集まりです。というわけで、Map<String,Integer> test;そしてtest.put(A[i],B[i])でエレメントを加えることができます。
get関数を利用し、特定のエレメントを取ることもできます。詳しいことはjavaのヘルプファイルを参考してください

投稿2016/01/23 22:41

GikgeStephano

総合スコア60

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

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

GikgeStephano

2016/01/23 22:48

すみません、そのAとBはlistなら、A[i]とB[i]ではない、A.get(i)とB.get(i)です
kemi

2016/01/24 04:53

すみまんせん、最終的にMap<Integer, List<String>>で各IntegerのKeyに対しList<String>をValueにしたいと考えています。 質問が分かりずらく、申し訳ありません。
GikgeStephano

2016/01/24 08:06

わかりました。 では,Map<Integer, List<String>> C; for(int i = 0;i < A.length && B.length;i ++) C.put(A.get(i),B.get(i)); Map<List<String>,Integer> D for(int i = 0;i < A.length&&i < B.length;i ++) D.put(B.get(i),A.get(i)); //それだけでいい
kemi

2016/01/24 16:22

getメソッドを使用すればよかったのですね、ありがとうございます!
guest

0

for文に対しgetメソッドを使用することで解決することが出来ました。
ご回答してくださった皆様本当にありがとうございました。

投稿2016/01/24 16:44

kemi

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問