web-dev-qa-db-ja.com

「\ t」(タブ)で印刷すると、列が整列しません。

私には非常に奇妙な問題があります。これを書いた後:

for (File f : currentFile.listFiles()) {            
    if  (f.isDirectory()){
        System.out.println(f.getName()+"\t"+"Dir\t"+Command.getpremission(f)+"\t"+f.getTotalSpace());
    }
    else{
        System.out.println(f.getName()+"\t"+"File\t"+Command.getpremission(f)+"\t"+f.getTotalSpace());
    }

私はこれが印刷されているのを見ます:

see.txt File    rw  267642728448
see1.txt    File    rw  267642728456
see2.txt    File    rw  267642728448

タブに問題があるのはなぜですか?

28
Unknown user

この質問 に基づいて、次のコードを使用してメッセージをインデントします。

String prefix1 = "short text:";
String prefix2 = "looooooooooooooong text:";
String msg = "indented";
/*
 * The second string begins after 40 characters. The dash means that the
 * first string is left-justified.
 */
String format = "%-40s%s%n";
System.out.printf(format, prefix1, msg);
System.out.printf(format, prefix2, msg);

これは出力です:

短いテキスト:インデント
 looooooooooooooongテキスト:インデント
32
Matthias Braun

タブの「問題」は、テキストを固定タブ位置、通常は4文字または8文字の倍数(それらを表示するコンソールまたはエディターに応じて)にインデントすることです。最初のファイル名は7文字なので、終了後の次のタブストップは8桁目になります。ただし、後続のファイル名は8文字長なので、次のタブストップは12桁目になります。

列が同じ位置でうまくインデントされるようにしたい場合は、前の列の実際の長さを考慮し、次のタブの数を変更するか、代わりに必要な数のスペースを埋め込む必要があります。後者は、たとえば System.out.printf 適切な 形式仕様 (例:"%1$13s"は、最初の引数を文字列として表示するための最小幅13文字を指定します。

23
Péter Török

各行で提供するテキストの長さが異なるため、これが問題です。したがって、2番目のWordが長すぎる場合(_see2.txt_は8文字で、1つのタブの長さに対応する)、次の集計ポイントに移動するタブ。これを解決する1つの方法は、プログラムでパッドをf.getName()テキストに追加して、生成される各テキスト:_see.txt_または_see2.txt_が同じ長さ(たとえば_see.txt__ _see2.txt_)各タブが自動的に同じ集計ポイントに移動します。

JDK 1.5で開発している場合は、 Java.util.Formatter を使用してこれを解決できます。

_String format = "%-20s %5d\n";
System.out.format(format, "test", 1);
System.out.format(format, "test2", 20);
System.out.format(format, "test3", 5000);
_

この例はあなたにこのプリントを与えます:

_test                     1
test2                   20
test3                 5000
_
6
madx

Péterとduncanによるコメントの続きでは、通常、次のようなクイックパディングメソッドを使用します。

_public String rpad(String inStr, int finalLength)
{
    return (inStr + "                          " // typically a sufficient length spaces string.
        ).substring(0, finalLength);
}
_

同様に、lpad()も持つことができます

5
d-live

他の人が述べたように、文字列の可変長が問題です。

Apache Commonsは、車輪を再発明するのではなく、StringUtilsでこれを実現する、すてきできれいなソリューションを提供しています。

StringUtils.rightPad("String to extend",100); //100 is the length you want to pad out to.
2
jayb0b

問題は、ファイル名の長さです。最初のファイル名の長さは7文字しかないため、タブは8文字目になります(4文字ごとにタブを実行します)。ただし、次のファイル名は8文字なので、次のタブは12文字までです。また、ファイル名が11文字を超える場合は、同じ問題が再度発生します。

2
duncan

この例を使用して問題を処理できます。

System.out.printf( "%-15s %15s %n", "name", "lastname");
System.out.printf( "%-15s %15s %n", "Bill", "Smith");

ニーズを満たす適切な配置が見つかるまで、「%」で遊ぶことができます

1
Rolando F

Guavaの Strings.padEnd(String input、int minLength、char padding) を使用して、必要な長さに文字列を埋め込むこともできます

1
Kurru