QA@IT

javaのprintf()の記述について printf(String.format("%%%ds<-%%%ds+", (pl * 4) + 1, (pc - pl) * 4), "", "");

3876 PV

javaでアルゴリズムに関して勉強しているものです。以下のprintf()の記述の仕方が理解できなかったのでどなたかお答えいただけるでしょうか。都合上このコードの前後部分は省略させてもらっています。

System.out.printf(String.format("%%%ds<-%%%ds+", (pl * 4) + 1, (pc - pl) * 4), "", "");

自分の解釈としては%Sの%とSの間に%dが入っているという解釈なのですが、%が一つ余分にあることが疑問です。この%を一つ取り除き%%dsとするとコンパイルはできるのですが実行時エラーが出てしまいます。なぜこの場合(私の解釈があっていると仮定して)、%を一つ多く記述しなければいけないのでしょうか。お答えいただけたら幸いです。

回答

> %Sの%とSの間に%dが入っている

目的としてはそうですね。
printfで使う書式設定文字列をString.Formatで作っています、
つまり文字列を2段階で作成しています。

以下を実行してみて結果を違いを確認してみてください。
(printfではなくprintlnになっている事に注意してください)

System.out.println(String.format("%%%ds<-%%%ds+", (pl * 4) + 1, (pc - pl) * 4));
System.out.println(String.format("%%ds<-%%ds+", (pl * 4) + 1, (pc - pl) * 4));
System.out.println(String.format("%% ds<-%% ds+", (pl * 4) + 1, (pc - pl) * 4));
編集 履歴 (0)
  • 回答ありがとうございます! "文字列を2段階で作成している"、このコメントで今まで疑問に思っていた点が解消されました。
    追加で質問をさせていただきたいのですが、String.format()を使用して生成される文字列には""がついていません。String.format()を使い生成された文字列はprintf()の中では""がつかなくても大丈夫なのでしょうか?
    -
  • ""でくくられた中身はString型になります。言い方を変えると"から"までの中身はコードでなくてその中身をコードではなくStringとして扱って欲しいとjavaに伝えているわけですね。
    一方でString.formatは結果としてそもそもStringを返すので、それをしなくてもjavaは理解しますのでその必要はありません。
    -
  • 単純な例では
    String x = "a";
    String y = x;
    とするとき、2行目で x は " をくくっていませんが、yはxと同じものになりますよね。それと同じです。
    -
  • 回答ありがとうございます! わかりやすい説明で、私が疑問に思っていた点がすべて解決できました。初級者の質問にわざわざ答えてくださったこと、大変ありがたく思います。これからもjavaの勉強に精を出していきたいです。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。