StringBuilderで文字列表現を返す
- StringBuilderで出力する時に気をつけないと以下のエラーに。。
cannot convert from StringBuilder to String
- StringBuilderで連結結果をコンソール出力のみなら、printlnメソッドが引数に指定された任意のオブジェクトに対して
String.valueOf
からのsb.toString
を呼び出す- println は引数が文字列でなかったときに toString を呼び出してくれてた
StringBuilder sb = new StringBuilder();
System.out.println(sb);
- Stringとして結果を得る必要があるならtoStringを明示的に呼び出す
-
StringBuilderのtoStringメソッド
- 新しいStringオブジェクトを割り当て、初期化し、このオブジェクトの現在の文字列を返す
StringBuilder sb = new StringBuilder();
String result = sb.toString();//OK
String result = sb; //コンパイルエラー(型が違う)
参考
- StringBuilder#toString()
- PrintStream#println(Object)
- StackOverflow:cannot convert from StringBuilder to String
多次元配列を出力
- 1次元の配列ではお馴染みArrays.toString
- 多次元の配列ではArrays.deepToString
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) の新しい表を出力して下さい。各行の隣り合う整数は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
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
}
}