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

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

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

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

Q&A

解決済

2回答

5303閲覧

凸凹な2次元配列の定義の仕方

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

1クリップ

投稿2018/05/04 10:03

前提・実現したいこと

行によって列数の異なる凸凹な配列を扱うプログラムを書いています。

以下のように表示させようとしています

{ { 1, 2, 3, 4, 5 }, { 1, 3, 5 }, { 2, 4, 6, 8 } , }

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

凹凸な2次元配列の定義の仕方で1次元配列の際と同様に色々試してみているのですが、うまくいかずに困っています。
現在のコードでは以下のようなエラーが出ています。

{ [1,2,3,4,Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at ShowElements.main(ShowElements.java:14)

該当のソースコード

java

1public class ShowElements { 2 3 public static void main(String[] args) { 4 int[][] a = { { 1, 2, 3, 4, 5 }, 5 { 1, 3, 5 }, 6 { 2, 4, 6, 8 } 7 }; 8 System.out.println("{"); 9 for (int i = 0; i < a.length; i++) { 10 System.out.print("["); 11 if (a[i].length >= 2) { 12 for (int j = 0; j < a[i].length - 1; j++) { 13 System.out.print(a[i][j] + ","); 14 } 15 if (a[i].length >= 1) { 16 System.out.println(a[i][a[i].length] + "},"); 17 } 18 } 19 20 } 21 System.out.println("}"); 22 } 23 24} 25

試したこと

配列定義の部分を以下のようにしたところ、
「配列定数はイニシャライザーにおいてのみ使用可能 です」
とエラーが出ました。

int[][] a = new int [3][]; a[0] = {1, 2, 3, 4, 5}; a[1] = {1, 3, 5}; a[2] = { 2, 4, 6, 8} ; ### 実行環境 Eclipse Version: Oxygen.3a Release (4.7.3a)

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

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

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

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

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

umyu

2018/05/04 10:26

出力の最後の行の{ 2, 4, 6, 8 } , ←カンマは出力したいですか?
guest

回答2

0

ベストアンサー

凸凹な2次元配列の定義の仕方

1,凸凹な2次元配列(ジャグ配列)の定義は以下のようにすればコンパイルエラーは発生しません。

Java

1int[][] a = new int[3][]; 2a[0] = new int[] { 1, 2, 3, 4, 5 }; 3a[1] = new int[] { 1, 3, 5 }; 4a[2] = new int[] { 2, 4, 6, 8 };

[1,2,3,4,Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at ShowElements.main(ShowElements.java:14)

例外に関しては、そもそも論としてindexで要素に対してアクセスする必要がないので、拡張for文を使った以下のようなコードでも期待した結果が得られるかと。

Java

1import java.util.StringJoiner; 2import java.util.stream.Collectors; 3import java.util.stream.IntStream; 4 5public class A124743 { 6 public static void main(String[] args) { 7 8 int[][] a = new int[3][]; 9 a[0] = new int[] { 1, 2, 3, 4, 5 }; 10 a[1] = new int[] { 1, 3, 5 }; 11 a[2] = new int[] { 2, 4, 6, 8 }; 12 13 // ジャグ配列要素の最終要素のカンマの位置は質問文の要求仕様(" ,")と合わせましたが。 14 // 最終要素のカンマが不要なら" "にしてくださいな。 15 StringJoiner joiner = new StringJoiner(",\n", "{", " ,\n}"); 16 for (int[] row : a) { 17 String line = IntStream.of(row).mapToObj(String::valueOf).collect(Collectors.joining(", ", " { ", " }")); 18 // ※出力内容が[]でよければ、Arrays.toStringが使えます。 19 // line = Arrays.toString(row); 20 joiner.add(line); 21 } 22 System.out.println(joiner.toString()); 23 } 24} 25

実行結果

{ { 1, 2, 3, 4, 5 }, { 1, 3, 5 }, { 2, 4, 6, 8 } , }

◇参考情報
0. StringJoiner
0. Arrays#toString

投稿2018/05/04 11:12

umyu

総合スコア5846

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

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

退会済みユーザー

退会済みユーザー

2018/05/04 11:55

ご回答いただきましてありがとうございました。
guest

0

原因

java

1System.out.println(a[i][a[i].length-1] + "},");

書き換え

java

1String str = ""; 2str += "{\n"; 3for (int i = 0; i < a.length; i++) { 4 str += " ["; 5 for (int j = 0; j < a[i].length; j++) { 6 str += a[i][j] + (j == a[i].length - 1 ? "],\n" : ", "); 7 } 8} 9str += "}\n"; 10System.out.print(str); 11/* 12{ 13 [1, 2, 3, 4, 5], 14 [1, 3, 5], 15 [2, 4, 6, 8], 16} 17*/

投稿2018/05/04 10:17

編集2018/05/04 10:28
gingertail

総合スコア317

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問