teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/04/04 06:24

投稿

jimbe
jimbe

スコア13357

answer CHANGED
@@ -31,4 +31,86 @@
31
31
  然るに, お作りになった send(int[][]) で out.println している内容を System.out.println で表示してみたら何が出るでしょうか. (その表示内容そのものが送信されています.)
32
32
  int[][] receiveboard() の readLine() 部分をその表示内容にしたら board を再現できるでしょうか.
33
33
 
34
- どんな文字列を送受信すれば board を再現できるかをお考えください.
34
+ どんな文字列を送受信すれば board を再現できるかをお考えください.
35
+
36
+ #追記
37
+ 文字列の送受信が出来ていれば, 以下のように2次元配列←→文字列の変換メソッドを用意することでやり易くなるかと思います.
38
+ ```java
39
+ package teratail.q246663;
40
+
41
+ public class ArrayToStringText {
42
+ public static void main(String[] args) {
43
+ int[][] board1 = new int[8][8];
44
+ board1[3][3] = board1[4][4] = 1;
45
+ board1[3][4] = board1[4][3] = 2;
46
+ board1[2][4] = board1[3][5] = board1[4][2] = board1[5][3] = 3;
47
+
48
+ print("board1 -----",board1);
49
+
50
+ System.out.println("line -----");
51
+ String line = createString(board1);
52
+ System.out.println(line);
53
+
54
+ int[][] board2 = createArray2D(line);
55
+ print("board2 -----",board2);
56
+ }
57
+ static void print(String label, int[][] array) {
58
+ System.out.println(label);
59
+ for(int i=0;i<array.length; i++) {
60
+ for(int j=0; j<array[i].length; j++)
61
+ System.out.print(array[i][j]);
62
+ System.out.println();
63
+ }
64
+ }
65
+
66
+ /**
67
+ * 2次元配列を数字列化.<br>
68
+ * array2D.length と array2D[i].length が同じで無い場合, array2D[i].length の方が小さければ例外が発生するが,
69
+ * 大きい場合は i >= array2D.length の範囲のデータは無視される.
70
+ * @param array2D 2次元配列
71
+ * @return 文字列化した配列データ
72
+ */
73
+ static String createString(int[][] array2D) {
74
+ int w = array2D.length; //一辺の大きさ
75
+ int size = (int)Math.pow(w,2); //全体の大きさ
76
+ StringBuilder sb = new StringBuilder(size);
77
+ for(int i=0; i<size; i++) sb.append((char)('0'+array2D[i/w][i%w]));
78
+ return sb.toString();
79
+ }
80
+ /**
81
+ * 数字列を2次元配列化.
82
+ * @param line 数字列
83
+ * @return 2次元配列
84
+ * @throws IllegalArgumentException 正方形にならない場合
85
+ */
86
+ static int[][] createArray2D(String line) {
87
+ int w = (int)Math.sqrt(line.length()); //一辺の大きさ
88
+ if(Math.pow(w,2) != line.length()) throw new IllegalArgumentException(); //正方形のデータで無ければ例外
89
+ int[][] array2D = new int[w][w];
90
+ for(int i=0; i<line.length(); i++) array2D[i/w][i%w] = line.charAt(i)-'0';
91
+ return array2D;
92
+ }
93
+ }
94
+ ```
95
+ ```plain text
96
+ board1 -----
97
+ 00000000
98
+ 00000000
99
+ 00003000
100
+ 00012300
101
+ 00321000
102
+ 00030000
103
+ 00000000
104
+ 00000000
105
+ line -----
106
+ 0000000000000000000030000001230000321000000300000000000000000000
107
+ board2 -----
108
+ 00000000
109
+ 00000000
110
+ 00003000
111
+ 00012300
112
+ 00321000
113
+ 00030000
114
+ 00000000
115
+ 00000000
116
+ ```