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

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

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

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

Q&A

6回答

1450閲覧

多次元配列の出力について

keishinitta

総合スコア0

Java

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

0グッド

0クリップ

投稿2021/06/02 03:43

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
for文を使わずにprintf文を1つのみ使い配列要素、各要素数を出力。
123
45

このように出力したい。

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

配列要素が[[1,2,3],[4,5],[6]]と出力されてしまう。
繰り返しを使った場合は完成したのですが繰り返し文が無い場合の対処を教えていただきたいです。

該当のソースコード

java

1import java.util.Arrays; 2 3public class w{ 4 public static void main(String args[]){ 5 int [][] numbers = {{1, 2, 3}, {4, 5}, {6}}; 6 7 System.out.println(numbers[0].length); 8 System.out.println(numbers[1].length); 9 System.out.println(numbers[2].length); 10 11 System.out.printf(Arrays.deepToString(numbers)); 12 } 13} 14

試したこと

改行文を入れてみたりしましたがうまくいきません

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

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

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

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

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

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

K_3578

2021/06/02 03:48 編集

そもそもJavaはクラス名の頭は大文字では 「w」だけってその内何をしていたものか分からなくなりそうですが
m.ts10806

2021/06/02 03:49

ループ妥当な情報をあえてループなしでやろうとしても対してスキルアップにも繋がらないかと思いますが、何の課題ですか?
guest

回答6

0

java

1import java.util.*; 2import java.util.stream.*; 3 4public class Main { 5 public static void main(String args[]){ 6 int [][] numbers = {{1, 2, 3}, {4, 5}, {6}}; 7 var result = Arrays.stream(numbers) 8 .map( xs -> 9 Arrays.stream(xs) 10 .mapToObj(x -> String.valueOf(x)) 11 .collect(Collectors.joining(" ")) 12 ) 13 .collect(Collectors.joining("\n")); 14 15 System.out.println(result); 16 } 17}

投稿2021/06/02 07:24

編集2021/06/02 07:28
ozwk

総合スコア13553

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

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

0

繰返しは再帰呼出しで実現できます。

Java

1class Main { 2 public static void main(String args[]) { 3 int[][] numbers = {{1, 2, 3}, {4, 5}, {6}}; 4 func1(numbers, 0); 5 } 6 7 static void func1(int[][] a, int i) { 8 if (i < a.length) { 9 func2(a[i], 0); 10 func1(a, i+1); 11 } 12 } 13 14 static void func2(int[] a, int i) { 15 if (i < a.length) { 16 System.out.printf(i == a.length-1 ? "%d%n" : "%d ", a[i]); 17 func2(a, i+1); 18 } 19 } 20}

追記
再帰呼出しの関数を 1つにすることもできます。

Java

1class Main { 2 public static void main(String[] args) { 3 int[][] numbers = {{1, 2, 3}, {4, 5}, {6}}; 4 func(numbers, 0, 0); 5 } 6 7 static void func(int[][] a, int i, int j) { 8 if (i >= a.length) return; 9 int n = a[i].length; 10 if (j < n) { 11 System.out.printf(j == n-1 ? "%d%n" : "%d ", a[i][j]); 12 func(a, i, j+1); 13 } 14 else func(a, i+1, 0); 15 } 16}

でも、やっぱり deepToString の出力を正規表現で編集するのが簡単でしょう。

Java

1class Main { 2 public static void main(String[] args) { 3 int[][] numbers = {{1, 2, 3}, {4, 5}, {6}}; 4 System.out.printf(java.util.Arrays.deepToString(numbers) 5 .replaceAll("], |]]", "\n").replaceAll("\[|,", "")); 6 } 7}

投稿2021/06/02 15:27

編集2021/06/03 03:22
kazuma-s

総合スコア8224

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

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

0

Streamのmapを使用する

他の回答とほぼ同じですが微妙に違うので掲載します。

Java

1import static java.util.stream.Collectors.*; 2import java.util.stream.IntStream; 3import java.util.stream.Stream; 4 5public class q341705 { 6 7 public static void main(String[] args) { 8 9 int[][] a = {{1,2,3},{4,5},{6}}; 10 11 String lines = Stream.of(a) 12 .map(l -> IntStream.of(l).mapToObj(String::valueOf).collect(joining(" ","",System.lineSeparator()))) 13 .collect(joining()); 14 15 System.out.printf("%s",lines); 16 17 } 18 19}

Streamのcollectを使用する

collectを使うと次のようになります。

Java

1 String lines = Stream.of(a) 2 .collect( 3 StringBuffer::new, 4 (s,l) -> s.append( 5 IntStream.of(l).mapToObj(String::valueOf).collect(joining(" ","",System.lineSeparator())) 6 ), 7 (x,y) -> x.append(y)) 8 .toString();

最初のコードのほうが率直で良いと思いますが、collectを理解すると様々な応用が可能になります。

再帰させたらどうなる(追記)

再帰させてみました。昇順と降順でちょっとだけ違います。

Java

1 static Function<int[],String> arrayRow = a -> IntStream.of(a).mapToObj(String::valueOf).collect(joining(" ","",System.lineSeparator())); 2 3 static String asc(int[][] a, int i) { 4 return (i>= a.length) ? "" : arrayRow.apply(a[i]) + asc(a,i+1); 5 } 6 7 static String desc(int[][] a, int i) { 8 return (i>= a.length) ? "" : desc (a,i+1) + arrayRow.apply(a[i]); 9 }

それから、printlnをprintfに変更しました。

投稿2021/06/02 12:32

編集2021/06/05 20:53
xebme

総合スコア1090

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

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

xebme

2021/06/02 12:48

printfを使っていないけれど、後者のコードはprintfでもOKです。
guest

0

Stream APIとラムダ式を使った例です。(要Java SE8)
for文は使っていないけどforEachメソッドは使っているから少々微妙かも。

Java

1import java.util.Arrays; 2import java.util.List; 3import java.util.ArrayList; 4import java.util.stream.IntStream; 5 6public class Sample { 7 public static void main(String args[]){ 8 int[][] numbers = {{1, 2, 3}, {4, 5}, {6}}; 9 10 Arrays.stream(numbers).forEach(item -> { 11 List<String> ls = new ArrayList<String>(); 12 IntStream.of(item).forEach(v -> ls.add(String.valueOf(v))); 13 System.out.println(String.join(" ", ls)); 14 }); 15 } 16}

実行例:

terminal

1$ java -version 2openjdk version "1.8.0_252" 3OpenJDK Runtime Environment (build 1.8.0_252-8u252-b09-1~18.04-b09) 4OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode) 5$ javac Sample.java; java Sample 61 2 3 74 5 86 9$

投稿2021/06/02 06:54

編集2021/06/02 12:39
dodox86

総合スコア9256

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

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

0

java

1 System.out.printf( 2 Arrays.deepToString(numbers) 3 .replace("],", "\n") 4 .replaceAll("[\[\] ]", "") 5 .replace(",", " ") 6 .replaceAll("$", "\n") 7 );
1 2 3 4 5 6

投稿2021/06/02 04:49

編集2021/06/02 04:50
shiketa

総合スコア4061

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

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

0

内容が既知であること前提ですが、forでやっていたことを数字ベタ打ちでやればいいかと。

投稿2021/06/02 04:23

swordone

総合スコア20669

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問