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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2512閲覧

偶数だけが並ぶ配列について

nununu_nu

総合スコア9

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/04/29 13:00

前提・実現したいこと

配列xを用意し、その配列xの中の偶数だけを配列y(そのとき配列yの要素数も配列xの偶数の要素数分にしたい)に入れたいです。
該当のソースコードを実行した際、以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

{2,4, Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at Main.main(Main.java:8)

該当のソースコード

java

1public class Main { 2 public static void main(String[] args){ 3 int[] x = new int[]{1,2,3,4,5,6,7,8,9,10}; 4 int[] y = new int[x.length / 2]; //配列xの要素数の半分の要素数をもつ配列y(配列xの偶数の数分) 5 System.out.print("{"); 6 for(int i = 0; i < x.length; i++){ //配列xの要素数分for文を回す 7 if(x[i] % 2 == 0){ //もしx[i]が偶数なら 8 y[i] = x[i]; //y[i]にx[i]の値を入れる 9 if(i < x.length - 1){ 10 System.out.print(y[i] + ","); 11 }else{ 12 System.out.print(y[i]); 13 } 14 } 15 } 16 System.out.print("}"); 17 } 18}

2と4は出力されているのに、残りの6,8,10が出力されないのはどうしてなのでしょうか?
どこがおかしいかアドバイス等いただけますと幸いです。

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

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

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

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

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

guest

回答3

0

yの要素数が5しかないためです。

投稿2020/04/29 13:02

swordone

総合スコア20669

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

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

nununu_nu

2020/04/29 13:17

yの要素数が5でも、その中に2,4,6,8,10の計5つの要素を入れてあげたいので問題ないと勝手に解釈してしまっていたのですが…最初にyの要素数を入れる時の「x.length/2」がいけないということですか?
swordone

2020/04/29 13:25

とりあえずi=4までやって、yの中身を出力してみてください。 あなたが思っているのとは違う結果になるはずですから。
nununu_nu

2020/04/29 14:20 編集

[0, 2, 0, 4, 0]←こうなりました ということは、もし要素数10だとしても[0,2,0,4,0,6,0,8,0,10]と出力されてしまう、ということですよね これを[2,4,6,8,10]にするにはどうすれば良いのでしょうか…? →y[i/2]にx[i]の値を代入してあげることで解決しましたが、問題ないのでしょうか?無理やりな感じがしますが…
退会済みユーザー

退会済みユーザー

2020/04/30 02:47

なぜ無理やりな感じがしたのでしょうか。 もし、奇数のときは変な挙動をするのではないかと考えているなら x[i] % 2 == 0をx[i] % 2 != 0に変えてみてください。 奇数が出力されるはずです。
kazuma-s

2020/04/30 04:44

配列 x が { 2, 2, 3, 6, 0, 6, 7, 9 } のとき、配列 y は { 2, 2, 6, 0, 6 } にならないといけないんですよね。x の要素数は 8。y の要素数は 5。
退会済みユーザー

退会済みユーザー

2020/04/30 07:12 編集

なるほど。 xの要素がランダムだと例外が出る可能性があるんですね。 ただ、それを許容するとなるとそもそもyの初期化部分を変更しないといけなさそうですが。
nununu_nu

2020/05/02 04:40

今回は配列xに1〜10までの10個の数が順番に入っていて、その半分が偶数になるのが分かってたので要素数等を半分にすればいいのがわかるのですが、これがもし配列xにバラバラの数が入ってるとなると解決できなくなりますよね…その場合についてはまた考えてみます、ご丁寧にありがとうございました!
guest

0

ベストアンサー

次の手順でやればうまく行くのは分かりますか?

  1. x の中の偶数の個数を求める。
  2. その個数の要素を持つ配列 y を確保する。
  3. x の中の偶数を y にコピーする。
  4. y の値を表示する。

Java

1public class Main { 2 public static void main(String[] args){ 3 int[] x = {1,2,3,4,5,6,7,8,9,10}; 4 5 int n = 0; 6 for (int e : x) 7 if (e % 2 == 0) n++; 8 9 int[] y = new int[n]; 10 11 n = 0; 12 for (int e : x) 13 if (e % 2 == 0) y[n++] = e; 14 15 System.out.print("{"); 16 if (n > 0) { 17 System.out.print(y[0]); 18 for (int i = 1; i < n; i++) System.out.print("," + y[i]); 19 } 20 System.out.println("}"); 21 } 22}

for (int e : x) if (e % 2 == 0) n++;

for (int i = 0; i < x.length; i++) if (x[i] % 2 == 0) n++;
と書くこともできます。

e % 2 == 0 は (e & 1) == 0 と書くこともできます。

以上のことを理解できてもできなくてもコメントをお願いします。

投稿2020/05/01 02:52

kazuma-s

総合スコア8224

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

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

nununu_nu

2020/05/02 04:35

分かりやすかったです!ありがとうございます!
guest

0

swordone さんの答えの通りですが、y のインデックスを j など別の変数で管理して、代入した際にインクリメントするのも一つの方法かと。

投稿2020/04/29 13:05

Yasumichi

総合スコア1773

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問