web-dev-qa-db-ja.com

String.formatのパラメーターを再利用しますか?

String hello = "Hello";

String.format("%s %s %s %s %s %s", hello, hello, hello, hello, hello, hello);

hello hello hello hello hello hello 

Hello変数はformatメソッドの呼び出しで複数回繰り返す必要がありますか、それともすべての%sトークン?

122
Carey

ドキュメント から:

  • 一般、文字、および数値型の形式指定子の構文は次のとおりです。

        %[argument_index$][flags][width][.precision]conversion
    

    オプション argument_index 引数リスト内の引数の位置を示す10進整数です。最初の引数は"1$"で参照され、2番目の引数は"2$"などで参照されます。

String.format("%1$s %1$s %1$s %1$s %1$s %1$s", hello);
234

別のオプションはrelative indexingを使用することです:フォーマット指定子は最後のフォーマット指定子と同じ引数を参照します。

例えば:

String.format("%s %<s %<s %<s", "hello")

結果はhello hello hello hello

48
Daniel

次のように、引数%[argument_index$]にインデックスを付ける必要があります。

String hello = "Hello";
String.format("%1$s %1$s %1$s %1$s %1$s %1$s", hello);

結果:hello hello hello hello hello hello

10
Ahmad Al-Kurdi

String.formatで引数を再利用する一般的なケースの1つは、区切り文字を使用することです(CSVの場合は";"、コンソールの場合はタブ)。

System.out.println(String.format("%s %2$s %s %2$s %s %n", "a", ";", "b", "c"));
// "a ; ; ; b"

これは望ましい出力ではありません。 "c"はどこにも表示されません。

最初に区切り文字を使用する必要があり(%sを使用)、次の場合にのみ引数インデックス(%2$s)を使用する必要があります。

System.out.println(String.format("%s %s %s %2$s %s %n", "a", ";", "b", "c"));
//  "a ; b ; c"

読みやすさとデバッグのためにスペースが追加されます。フォーマットが正しいように見えると、テキストエディターでスペースを削除できます。

System.out.println(String.format("%s%s%s%2$s%s%n", "a", ";", "b", "c"));
// "a;b;c"
4
Eric Duminil