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

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

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

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

Q&A

解決済

4回答

403閲覧

Java配列の構文エラー

Chandler_Bing

総合スコア673

Java

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

0グッド

1クリップ

投稿2019/01/01 10:44

Java

1// while文を使った無限ループのサンプル 2public class InfiniteLoopSample { 3 4 public static void main(String[] args) { 5 6 int cnt = 0; 7 int[] values; 8 9 while (true) { 10 // ループカウンタを増やす 11 cnt++; 12 13 // サイコロを振る 14 int dice = (int) (Math.random() * 6.0 + 1); 15 values = {dice};/*エラーが出る*/ 16 17 // 1が出たらループを抜ける 18 if (1 == dice) { 19 break; 20 } 21 } 22 23 System.out.println("1が出るまで" + cnt + "回サイコロを振りました"); 24 25 for (int val : values) { 26 System.out.println("val = " + val); 27 } 28 } 29} 30

変数valuesにdiceの値をその都度代入し、最後の拡張for文で吐き出したいのですが、型の不一致等エラーが出ます。
values = {dice};/エラーが出る/ はどう書くのが正解でしょうか。

試した書き方は
values = dice;
values = {dice};
values[] = dice;
values[] = {dice};
values = new int[] { dice };

です。最後の初期化してしまうので、結果が必ず1になりますが唯一エラーが出ませんでした。
よろしく願いします

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

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

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

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

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

LouiS0616

2019/01/01 10:53 編集

なぜvaluesを配列にする必要があったのでしょうか? 真意が分かりかねるので追記のほどよろしくお願いします。
m.ts10806

2019/01/01 16:00

しれっとコーディング入ってますが、未解決質問を放置のままはさすがにまずいのでは。それまで指摘なりコメントなり回答なり入れてくれている人たちの厚意をなかったことにされてません?
guest

回答4

0

ベストアンサー

Javaの配列は、newする時にしか長さを決められないので、今回の例のような、コードが進むに連れて長さを長くする必要がある状況には向きません。

代わりにArrayListなどを使いましょう。

java

1// valuesに絡む変更部分のみ記載 2List<Integer> values = new ArrayList<Integer>(); 3 4values.add(dice); 5 6for (Integer val : values) {

投稿2019/01/01 10:54

編集2019/01/01 10:55
maisumakun

総合スコア145121

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

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

Chandler_Bing

2019/01/01 10:59

ありがとうございます。 int n[] values; : : : n[]= 20; : : n[] = 40; のようにはできず、 n[0] = 20; n[1] = 40; のようにしないといけないということでしょうか。
maisumakun

2019/01/01 11:01

まず、宣言と同時あるいは宣言後に代入する形で、「int values[] = new int[7];」のように配列をnewで生成して代入することが必要です(そうしないとvaluesはnullのままです)。 そして、一度生成したら、あとは長さを変える方法は「もう一度配列を生成する」しかありません。[]=で末尾に入れると伸びる、なんて便利な機能はありません。
guest

0

要素の数が可変なら Arraylist をつかうのが普通です。

予め宣言した Array のサイズにおさまらなくなったらサイズを増やした Array を得ることは不可能ではありません。
サイズを変更した新たな Array をつくることはできます。

参考情報

  • Merge arrays into a new object array in Java

https://www.geeksforgeeks.org/merge-arrays-into-a-new-object-array-in-java/

このページでは 3 つの方法が示されています。
そのなかの1つは次のような処理をしています。

java

1 // Create an empty Object array of the combined 2 // size of the array a and array b 3 Object[] n = new Object[a.length + b.length]; 4 5 // Copy the array a into n 6 System.arraycopy(a, 0, n, 0, a.length); 7 8 // Copy the array b into n 9 System.arraycopy(b, 0, n, a.length, b.length);

質問文での場合なら、次のようにするのです。
最初に宣言した Array サイズを超えそうになったら、

  • サイズを増やした 空の Array を生成して,
  • そこへ現在の Array の内容を copy して
  • 以後はその新たな Array を使う

でもこんなことをするのは面倒なので ArrayList をつかったほうがよいですけど。

投稿2019/01/01 12:06

katoy

総合スコア22324

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

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

0

合ってるかどうか?

java

1 public static void main(String[] args) { 2// while文を使った無限ループのサンプル 3 4 int cnt = 0; 5 int[] values; 6 values = new int[6]; 7 8 while (cnt < 6) { 9 // ループカウンタを増やす 10// cnt++; 11 12 // サイコロを振る 13 int dice = (int) (Math.random() * 6.0 + 1); 14 values[cnt++] = dice;/*エラーが出る*/ 15 16 // 1が出たらループを抜ける 17// if (1 == dice) { 18// break; 19// } 20 } 21 22 System.out.println("1が出るまで" + cnt + "回サイコロを振りました"); 23 24 for (int val : values) { 25 System.out.println("val = " + val); 26 } 27 } 28

投稿2019/01/01 10:59

編集2019/01/01 11:02
cateye

総合スコア6851

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

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

maisumakun

2019/01/01 11:04

元のコードは「1が出るまでに出た目を順に記録する」ことを狙っているようですが、それと趣旨が変わっていませんか?
cateye

2019/01/01 11:07 編集

>while文を使った無限ループのサンプル・・・(見落としてました;;)とあるので間違いかもしれません、Listの使用が必要かも?
guest

0

配列変数の宣言以外で配列の初期化をする場合は、最後の書き方が唯一正しい書き方になります。
ただ、そもそも配列は生成したら長さ固定なので、その都度代入という使い方には向きません。
それをやりたいならListを使うべきでしょう。

投稿2019/01/01 10:54

swordone

総合スコア20649

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

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

Chandler_Bing

2019/01/01 11:04

ありがとうございます。PHP脳になっていたので大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問