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

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

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

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

配列

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

Q&A

解決済

2回答

1765閲覧

setTextで配列の全要素を効率よく一気に表示したい

clothblue

総合スコア16

Java

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

配列

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

0グッド

0クリップ

投稿2020/08/13 07:11

編集2020/08/13 07:12

前提・実現したいこと

常に中身が更新される下記のようなString map[][]という配列がありJTextAreaに表示させたいのですが、この7×7の中身をこの形のままsetTextで表示させるいい方法が思いつかず困っています。
.txtに書き出してreadLine()を行の数だけ書けば何とか表現出来たのですが、forやwhileなどを使用した良い方法などあれば教えて頂けますと助かります。

+-----+
| □□□□□ |
| □□□□□ |
| □□□□□ |
| □□●□□ |
| □□■□□ |
+-----+

//このようにかけば上の図を表現出来るのですが、配列のサイズが大きくなった場合のために改善したいです setText(readLine() + "\n" + readLine() + "\n" + readLine() + "\n" + readLine() + "\n" + readLine() + "\n" + readLine() + "\n" + readLine() + "\n" + readLine() + "\n");

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

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

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

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

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

dodox86

2020/08/13 07:18

7文字×7行なのに、なぜString map[][]と言うStringの2次元配列なのでしょうか。例えば"| □□□□□ |"だけだと、そのmapにはどのように入っているのでしょうか。
clothblue

2020/08/13 07:25

分かりにくくてすみません。 下記のように1文字が7×7で入っております。 String map[][] = { {"+","-","-","-","-","-","+",}, {"| ","□","□","□","□","□"," |",}, {"| ","□","□","□","□","□"," |",}, {"| ","□","□","□","□","□"," |",}, {"| ","□","□","□","□","□"," |",}, {"| ","□","□","■","□","□"," |",}, {"+","-","-","-","-","-","+",} };
guest

回答2

0

一番簡単に考えるとループとString.joinでできます。Java Stream APIを使えばコードはもう少し短くなりますが、最初はちょっと何が行われているか分かりづらいかもしれませんね。それらのパターンを実装してみましたので見比べてみてください。

Java

1public class Main { 2 public static void main(String[] args) { 3 String[][] map = { 4 {"+","-","-","-","-","-","+",}, 5 {"| ","□","□","□","□","□"," |",}, 6 {"| ","□","□","□","□","□"," |",}, 7 {"| ","□","□","□","□","□"," |",}, 8 {"| ","□","□","□","□","□"," |",}, 9 {"| ","□","□","■","□","□"," |",}, 10 {"+","-","-","-","-","-","+",} 11 }; 12 13 System.out.println(">>> #1 単なるループで"); 14 for (int i = 0; i < map.length; i++) { 15 String line = String.join("", map[i]); 16 System.out.println(line); 17 } 18 19 System.out.println(">>> #2 自作のメソッドで"); 20 String s = toBoardString(map); 21 System.out.print(s); 22 23 System.out.println(">>> #3 Stream と StringJoiner"); 24 java.util.StringJoiner sj = new java.util.StringJoiner("\n"); 25 java.util.Arrays.stream(map).forEach(line -> sj.add(String.join("", line))); 26 System.out.println(sj.toString()); 27 } 28 29 public static String toBoardString(String[][] source) { 30 StringBuffer sb = new StringBuffer(); 31 for (int i = 0; i < source.length; i++) { 32 sb.append(String.join("", source[i])); 33 sb.append("\n"); 34 } 35 36 return sb.toString(); 37 } 38} 39

実行結果です。

sh

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 Main.java 6$ java Main 7>>> #1 単なるループで 8+-----+ 9| □□□□□ | 10| □□□□□ | 11| □□□□□ | 12| □□□□□ | 13| □□■□□ | 14+-----+ 15>>> #2 自作のメソッドで 16+-----+ 17| □□□□□ | 18| □□□□□ | 19| □□□□□ | 20| □□□□□ | 21| □□■□□ | 22+-----+ 23>>> #3 Stream と StringJoiner 24+-----+ 25| □□□□□ | 26| □□□□□ | 27| □□□□□ | 28| □□□□□ | 29| □□■□□ | 30+-----+ 31$ 32

投稿2020/08/13 07:59

dodox86

総合スコア9183

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

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

dodox86

2020/08/13 08:08

尚、JTextAreaにセットする文字列を生成することが主題だと考えましたので、文字列生成部分のみの例示としています。
clothblue

2020/08/13 08:44

ご丁寧にありがとうございます。 現状全てを理解出来ていないの勉強させて頂きます。
guest

0

ベストアンサー

streamで処理するとこんな感じでしょうか。

java

1import java.awt.BorderLayout; 2import java.awt.Container; 3import java.util.Arrays; 4import java.util.stream.Collectors; 5 6import javax.swing.JFrame; 7import javax.swing.JPanel; 8import javax.swing.JTextArea; 9 10class JSample extends JFrame{ 11 public static void main(String args[]){ 12 JSample frame = new JSample(""); 13 frame.setVisible(true); 14 } 15 16 JSample(String title){ 17 setTitle(title); 18 setBounds(100, 100, 600, 400); 19 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 20 21 String map[][] = { 22 {"+","-","-","-","-","-","+",}, 23 {"| ","□","□","□","□","□"," |",}, 24 {"| ","□","□","□","□","□"," |",}, 25 {"| ","□","□","□","□","□"," |",}, 26 {"| ","□","□","□","□","□"," |",}, 27 {"| ","□","□","■","□","□"," |",}, 28 {"+","-","-","-","-","-","+",} 29 }; 30 31 JTextArea textarea = new JTextArea(20, 40); 32 textarea.setText( 33 Arrays.stream(map) 34 .map(m -> 35 Arrays.stream(m) 36 .collect(Collectors.joining(""))) 37 .collect(Collectors.joining("\n"))); 38 39 JPanel p = new JPanel(); 40 p.add(textarea); 41 42 Container contentPane = getContentPane(); 43 contentPane.add(p, BorderLayout.CENTER); 44 } 45}

投稿2020/08/13 07:35

yureighost

総合スコア2183

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

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

clothblue

2020/08/13 07:49

やりたいことが出来ていてとても助かります。 ただstreamというものが何なのか分かっていないので勉強が必要そうです。 ご丁寧にありがとうございました。
clothblue

2020/08/13 08:12

お手数をおかけして申し訳ないんですが下記の部分が何をしているかを簡単にで構いませんので教えて頂く事は可能でしょうか? Arrays.stream(map) .map(m -> Arrays.stream(m) .collect(Collectors.joining(""))) .collect(Collectors.joining("\n")));
yureighost

2020/08/13 08:26

streamも繰り返し処理を完結に書くためのAPIですので、やっていることはfor文と似ています。 まずArrays.streamメソッドが配列にstream処理を適用します。 mapは中間処理で内部的には配列の中の配列に対して処理をしていますので、 更にArrays.streamメソッドを適用してstream化しています。 collectは終端処理でCollectionや配列にも変換できますが、 中に指定しているCollectors.joiningは配列の要素を引数に指定した区切り文字で連結し、 Stringとして返します。 今回は区切り文字がいらないので""の空文字を指定しています。 これで内部的には一行分の文字が出来上がっているので、 それを外側の終端処理collectで、こちらは改行が必要なため 改行コードを区切り文字として連結して返しています。 と、過剰書きにして返していますが、 ラムダ式とかも使っているので、全く知識がない場合理解するのはなかなか難しいです。 今回はstreamを入れ子にして書いてしまったので猶更難しくなってしまったのですが、 一次元配列の連結ならString.joinでもできるので、 Arrays.stream(map) .map(m -> String.join("")) .collect(Collectors.joining("\n")) こう書くこともできます。 多分こちらの方が少し理解しやすいと思います。
clothblue

2020/08/13 08:47

ありがとうございます。 教えて頂いたことを確認しながらstreamについて勉強してみようと思います。 覚えると便利なことが多そうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問