【Java】多次元配列を出力・表計算（AOJ⑥表計算）

#StringBuilderで文字列表現を返す
* StringBuilderで出力する時に気をつけないと以下のエラーに。。<br>
`cannot convert from StringBuilder to String`
* StringBuilderで連結結果をコンソール出力のみなら、**printlnメソッド**が引数に指定された任意のオブジェクトに対して`String.valueOf`からの`sb.toString`を呼び出す
    * println は引数が文字列でなかったときに toString を呼び出してくれてた

```Java
StringBuilder sb = new StringBuilder();
System.out.println(sb);
```
* Stringとして結果を得る必要があるなら**toStringを明示的に呼び出す**
* **StringBuilderのtoStringメソッド**
    * 新しいStringオブジェクトを割り当て、初期化し、このオブジェクトの現在の文字列を返す

```java
StringBuilder sb = new StringBuilder();
String result = sb.toString();//OK
String result = sb;  //コンパイルエラー(型が違う)
```

 
#####参考
* [StringBuilder#toString()](https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuilder.html#toString())
* [PrintStream#println(Object)](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html#println-java.lang.Object-)
* [StackOverflow:cannot convert from StringBuilder to String](https://stackoverflow.com/questions/16155800/type-mismatch-cannot-convert-from-stringbuilder-to-string)





#多次元配列を出力
* 1次元の配列ではお馴染みArrays.toString
* **多次元の配列ではArrays.deepToString**

```java
import java.util.*;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) throws Exception {
		// 1次元配列
		int[] nums = new int[] { 1, 2, 3 };
		System.out.println(nums);//[I@36baf30c
		System.out.println(Arrays.toString(nums));// [1, 2, 3]
		// 多次元配列
		int[][] nums2 = new int[][] { { 1, 2, 3 }, { 11, 12, 13 } };
		System.out.println(nums2);// [[I@7a81197d
		System.out.println(Arrays.toString(nums2));// [[I@5ca881b5, [I@24d46ca6]

		System.out.println(Arrays.deepToString(nums2));// [[1, 2, 3], [11, 12, 13]]
	}
}
```

#表計算（ITP1-7）
>表計算を行う簡単なプログラムを作成します。
表の行数rと列数c、r × c の要素を持つ表を読み込んで、各行と列の合計を挿入した新しい表を出力するプログラムを作成して下さい。
【Input】
最初の行にrとcが空白区切りで与えられます。続くr行にそれぞれc個の整数が空白区切りで与えられます。
【Output】
(r+1) × (c+1) の新しい表を出力して下さい。各行の隣り合う整数は１つの空白で区切って下さい。各行の最後の列としてその行の合計値を、各列の最後の行としてその列の合計値を、最後の行・列に表全体の合計値を挿入して下さい。
【Constraints】
* 1 ≤ r, c ≤ 100
* 0 ≤ 要素 ≤ 100
【入力例】
4 5
1 1 3 4 5
2 2 2 4 5
3 3 0 1 1
2 3 4 4 6
【出力例】
1 1 3 4 5 14
2 2 2 4 5 15
3 3 0 1 1 8
2 3 4 4 6 19
8 9 9 13 17 56

```java
import java.util.Scanner;
import java.util.Arrays;
class Main {
	Scanner sc = new Scanner(System.in);

	public void run() {
		int r = sc.nextInt(), c = sc.nextInt();

		int[][] A = new int[r + 1][c + 1];

        //r × c の要素を持つ表をスキャン
		for (int i = 0; i < r; i++)
			for (int j = 0; j < c; j++) {
				A[i][j] = sc.nextInt();
			}
        //列ごとの合計を計算しc列目に代入
		for (int i = 0; i < r; i++) {
			int sum = 0;
			for (int j = 0; j < c; j++) {
				sum += A[i][j];
			}
			A[i][c] = sum;
		}
		//行ごとの合計を計算しc列目に代入
		for (int j = 0; j <= c; j++) {
			int sum = 0;
			for (int i = 0; i < r; i++) {
				sum += A[i][j];
			}
			A[r][j] = sum;
		}
		//中身確認
        //System.out.println(Arrays.deepToString(A));
		
        //一列ずつjoin
		for (int i = 0; i <= r; i++)
			ln(join(A[i], " "));
	}

	public static void main(String[] args) {
		new Main().run();
	}

	public static void ln(Object o) {
		System.out.println(o);
	}

    //StringBuilderで出力する文字列を作成
	public static String join(int[] array, String separator) {
	    //1行1列目から最初の一文字（array[0]）取得　
		StringBuilder str = new StringBuilder(array[0] + ""); 

        //2文字目から回すことで最後の空白を出力しないようにする
		for (int i = 1; i < array.length; i++) {
			str.append(separator).append(array[i] + "");
		}
		return str.toString();
        
        //toStringでStringに変換しないとコンパイルエラー
        //return str; 
        //incompatible types: StringBuilder cannot be converted to String
	}
}
```