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

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

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

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

1回答

439閲覧

Java ArrayListの使い方について

tkr1205

総合スコア13

Java

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2018/01/27 08:35

前提・実現したいこと

JavaのArrayListを用いて、1から5の数字をランダムに並び替えたものをさらにArrayListに追加したいと考えています。
また、あとで数字の幅は変更したいと考えているので、5つだけ変数を作るという処理は考えていません。

該当のコード

ArrayList<Integer> m = new ArrayList<Integer>(); ArrayList<Integer> w = new ArrayList<Integer>(); for(int i=1;i<=5;i++) { m.add(i); w.add(i); } ArrayList<ArrayList<Integer>> mp = new ArrayList<ArrayList<Integer>>(); ArrayList<ArrayList<Integer>> wp = new ArrayList<ArrayList<Integer>>(); for(int i = 1;i<=5;i++) { Collections.shuffle(m); Collections.shuffle(w); mp.add(m); wp.add(w); } System.out.println(mp);

期待される出力(例)

[[3, 4, 5, 1, 2], [5, 1, 2, 3, 4], [2, 3, 4, 5, 1], [4, 5, 1, 2, 3], [1, 2, 3, 4, 5]]]

実際の出力(例)

[[4, 1, 3, 5, 2], [4, 1, 3, 5, 2], [4, 1, 3, 5, 2], [4, 1, 3, 5, 2], [4, 1, 3, 5, 2]]

試したこと

ランダムなシード値を設定しても、なぜか最後にシャッフルしたArrayListの値に変わってしまいます。

補足情報(FW/ツールのバージョンなど)

Java 1.8.0_152
Ecclipse

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

以下のように、mw を作る行を、shuffle するループの中へ移動すれば
とりあえず意図通りになると思います。

** 修正前:**

java

1import java.util.ArrayList; 2import java.util.Collections; 3 4public class Main { 5 6 public static void main(String[] args) { 7 8 ArrayList<Integer> m = new ArrayList<Integer>(); 9 ArrayList<Integer> w = new ArrayList<Integer>(); 10 for (int i = 1; i <= 5; i++) { 11 m.add(i); 12 w.add(i); 13 } 14 15 ArrayList<ArrayList<Integer>> mp = new ArrayList<ArrayList<Integer>>(); 16 ArrayList<ArrayList<Integer>> wp = new ArrayList<ArrayList<Integer>>(); 17 18 for (int i = 1; i <= 5; i++) { 19 Collections.shuffle(m); 20 Collections.shuffle(w); 21 mp.add(m); 22 wp.add(w); 23 } 24 System.out.println(mp); 25 } 26}

修正後:

java

1import java.util.ArrayList; 2import java.util.Collections; 3 4public class Main { 5 6 public static void main(String[] args) { 7 8 ArrayList<ArrayList<Integer>> mp = new ArrayList<ArrayList<Integer>>(); 9 ArrayList<ArrayList<Integer>> wp = new ArrayList<ArrayList<Integer>>(); 10 11 for (int i = 1; i <= 5; i++) { 12 13 ArrayList<Integer> m = new ArrayList<Integer>(); 14 ArrayList<Integer> w = new ArrayList<Integer>(); 15 for (int j = 1; j <= 5; j++) { 16 m.add(j); 17 w.add(j); 18 } 19 20 Collections.shuffle(m); 21 Collections.shuffle(w); 22 mp.add(m); 23 wp.add(w); 24 } 25 System.out.println(mp); 26 } 27} 28

参考になりましたら幸いです。


追記

(1) なぜ修正前のだとダメか

なぜ修正前のだと意図通りにならないのかというと、
リストのリストである mpwpのそれぞれに、
5 個の別々のリストを要素として追加しているつもりでも、
実際には、m および w の1個の同じリストオブジェクトを
5回追加しているだけだからです。(直感的にいえば、「同じものが5個入っている」的なイメージ)
意図したように動かすには shuffle される直前で毎回m および w
前回のループのときとは別物として作る必要があります。

(2) リファクタ

回答に載せた、修正後のコードを以下の点でリファクタしてみました。

  1. リスト型の変数を宣言するとき、左辺には ArrayListを使わず、インタフェース型のListにしておく。
  2. リストの初期化の右辺で、ArrayList<・・・>・・・ は省略してもよい。
  3. mp の、shuffleされる前の状態のものは Arrays.asListを使えば、それぞれ1行で書ける。

これらを適用すると、以下のようにも書けます。

java

1import java.util.ArrayList; 2import java.util.Arrays; 3import java.util.Collections; 4import java.util.List; 5 6public class Main { 7 8 public static void main(String[] args) { 9 10 List<List<Integer>> mp = new ArrayList<>(); 11 List<List<Integer>> wp = new ArrayList<>(); 12 13 for (int i = 1; i <= 5; i++) { 14 15 List<Integer> m = Arrays.asList(1, 2, 3, 4, 5); 16 List<Integer> w = Arrays.asList(1, 2, 3, 4, 5); 17 18 Collections.shuffle(m); 19 Collections.shuffle(w); 20 21 mp.add(m); 22 wp.add(w); 23 } 24 25 System.out.println(mp); 26 } 27}

投稿2018/01/27 08:50

編集2018/01/27 09:51
jun68ykt

総合スコア9058

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

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

tkr1205

2018/01/27 08:57

素早い回答ありがとうございます。 しっかりと期待している出力がなされました。 ありがとうございました。
jun68ykt

2018/01/27 09:09

解決されたようでよかったです!
tkr1205

2018/01/27 09:41

追記のコードはとてもきれいですね。 参考にさせていただこうと思います。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問