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

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

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

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

Q&A

解決済

4回答

486閲覧

配列型のArrayListへのデータ入力がうまくいきません。

HelpfulJp

総合スコア22

Java

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

0グッド

0クリップ

投稿2018/11/03 04:38

編集2018/11/03 04:50

配列番号0~10まであるInteger配列を
さらにInteger配列型のArrayListに格納する1つ1つ格納するプログラムを作ってます。

データはメモ帳より取り出してますが問題ありませんでした。
問題なのは、while文内のデータの代入です。
よろしく御願いします。

java

1Scanner scan=new Scanner(new File("data.txt")); 2 int num=0; 3 Integer[] p=new Integer[11]; 4 while(scan.hasNext()){ 5 p[num%11]=scan.nextInt(); 6 num+=1; 7 if(num % 11==0){ 8 ms.add(p); 9 } 10 }

データセットは、以下の2行です。
3 1 0 -1 1 0 -1 0 1 0 4
5 0 0 0 1 0 -1 0 1 0 3

しかし、ArrayList別に表示(出力)したときは
5 0 0 0 1 0 -1 0 1 0 3
5 0 0 0 1 0 -1 0 1 0 3
と、1行目のデータが上書きされてしまいます。

表示(出力)のコードは以下になります。

java

1for(int i=0;i<ms.size();i++){ 2 for(int j=0;j<ms.get(i).length;j++){ 3 System.out.print(ms.get(i)[j]+" "); 4 } 5 System.out.println(); 6}

変数msとは、以下の様に宣言してます。
※ArrayList<Integer[]> ms=new ArrayList<Integer[]>();

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

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

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

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

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

guest

回答4

0

ArrayList<Integer[]> ms=new ArrayList<Integer[]>();

だと、integerの配列のインスタンスを取りますんで、配列のナカミまでは保存されません
# おなじインスタンスだと同じものがAddされる

なので、別に配列のインスタンスを作ってナカミをコピーしたものをAddしましょう

投稿2018/11/03 05:06

y_waiwai

総合スコア87774

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

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

HelpfulJp

2018/11/03 05:32

アドバイスありがとうございます。うまくいきました!
guest

0

ベストアンサー

一時変数pを使いまわしているのが原因です。
msに一行押し込む度に、配列インスタンスを新しく生成してやってください。

実験コード

Java

1import java.util.*; 2 3class Main { 4 public static void main(String[] args) { 5 List<Integer[]> ms=new ArrayList<Integer[]>(); 6 7 Integer[] p = new Integer[2]; 8 p[0] = 1; p[1] = 2; 9 ms.add(p); 10 11 p = new Integer[2]; // 必要な処理 12 p[0] = 3; p[1] = 4; 13 ms.add(p); 14 15 for(Integer[] line: ms) { 16 System.out.println(Arrays.toString(line)); 17 } 18 } 19}

実行結果 Wandbox

[1, 2] [3, 4]

『必要な処理』をコメントアウトすると... Wandbox

[3, 4] [3, 4]

投稿2018/11/03 05:05

LouiS0616

総合スコア35660

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

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

HelpfulJp

2018/11/09 15:38 編集

事例付きの回答助かりました! 自己解決のコードの様に書いたらうまくいきました。 それにしても、インスタンスとは不便ですね。^^;
guest

0

new Integer[11]
でなく、
List<Integer>
にファイルから読み込んだ値をためていき、11個たまったら、
Integer[11] をつくるようにしてみました。

java

1package teratail; 2 3import java.io.File; 4import java.io.FileNotFoundException; 5import java.util.ArrayList; 6import java.util.List; 7import java.util.Scanner; 8 9public class MainTera { 10 public static void main(String[] args) { 11 List<Integer[]> ms = new ArrayList<Integer[]>(); 12 13 try (Scanner scan = new Scanner(new File("data_tera.txt"))) { 14 int num = 0; 15 List<Integer> list = new ArrayList<Integer>(); 16 while (scan.hasNext()) { 17 list.add(scan.nextInt()); 18 num++; 19 20 if (num % 11 == 0) { 21 // Integer[] ary = new Integer[11]; 22 // for (int i = 0; i < list.size(); i++) { 23 // ary[i] = list.get(i); 24 // } 25 Integer[] ary = list.stream().toArray(Integer[]::new); 26 ms.add(ary); 27 list.clear(); 28 } 29 } 30 } catch (FileNotFoundException e) { 31 e.printStackTrace(); 32 } 33 34 for (int i = 0; i < ms.size(); i++) { 35 for (int j = 0; j < ms.get(i).length; j++) { 36 System.out.print(ms.get(i)[j] + " "); 37 } 38 System.out.println(); 39 } 40 } 41}

実行例
イメージ説明

投稿2018/11/03 07:55

katoy

総合スコア22324

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

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

HelpfulJp

2018/11/06 00:55

確かに!インスタンスの手間が省けていいですね。 回答ありがとうございます。
swordone

2018/11/06 01:35

これならわざわざStreamにする必要ないのでは…? list.toArray(new Integer[0]);
katoy

2018/11/06 12:42

はい、Stream は不要でした。
guest

0

アドバイスをもとに書き直したらうまくいきました。
お二方ありがとうございます。

java

1 2while(scan.hasNext()){ 3 p[num%11]=scan.nextInt(); 4 num+=1; 5 if(num % 11==0){ 6 ms.add(num/11-1,p); 7 p=new Integer[11]; 8 } 9}

投稿2018/11/03 05:30

HelpfulJp

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問