1

テーブルのように出力に印刷したいデータ構造があります。

メソッドを使用しましSystem.Out printfたが、結果は良くありません。

System.out.printf("%4s  %-7s   %-4s   %-7s%n", "node", "node Ip", "Type", "subType");
System.out.printf("%2d  %-7s   %-12s   %-21s%n", node.getNodeKey(),
              node.getNodeIpAddress(), 
              node.getNodeType(), 
              node.getNodeSubType());

結果は次のとおりです。

node  node Ip   Type   subType
 2  10.1.1.2   NODETYPE_WDM   NODESUBTYPE_RROADM_2 
 0            NODETYPE_NONE   NODESUBTYPE_NONE 

これをうまく行う賢い方法はありますか?

どうもありがとう。

4

3 に答える 3

1

データが既にメモリ内で読み取られており、オフラインで作業できる場合: データが本質的に 1 つずつ表示されていないことを意味します。または、そうである場合、それらをテーブル内に格納することが可能です: データ構造またはコレクションのような 2D 配列事前に作業する:

  1. 各列の最大幅を計算してみることができます
  2. 次に、最大幅をフォーマット フラグとして使用し"%"+maxWidth[col]+"s"ます。

私はあなたのために短い実用的な例を提供しています:

String data[][] = { {"Id", "Vehicle", "Disance" },
                    {"1", "ByCycle", "2 km"}, 
                    {"2", "Car", "10 km"}, 
                    {"3", "Van", "6.5 km"} 
                  };

        int col = data[0].length;
        int row = data.length;

        int maxWidth[] = new int[col];

        for(String[] rowD : data)
         for(int i=0; i< col; i++)
         {
             if(maxWidth[i] < rowD[i].length())
                 maxWidth[i] = rowD[i].length();
         }

        String format = "";

        for(int x:maxWidth)
            format += "%-"+(x+2)+"s ";

        format +="%n";

        for(String[] rowD : data)
        {
            System.out.printf(format, rowD);
        }

サンプル出力は次のようになります。

Id   Vehicle   Disance   
1    ByCycle   2 km      
2    Car       10 km     
3    Van       6.5 km   
于 2013-11-12T18:52:38.233 に答える
1

それはあなたが「賢い」とはどういう意味かにもよると思います。

しかし、現在のやり方を続けるには、次の 2 つのことを試してください。

1) Header row field widths must be the same size as data row widths; and
2) You'll want them to be big enough.

これは私が何を意味するかを示しています:

  public void printLineImproved (int node, String nodeIp, String nodeType, String nodeSubtype) {
    System.out.printf("%4s  %-12s   %-12s   %-21s%n", "node", "node Ip", "Type", "subType");
    System.out.printf("%4d  %-12s   %-12s   %-21s%n", node, nodeIp, nodeType, nodeSubtype);
  }

その出力は次のとおりです。

node  node Ip        Type           subType              
   2  10.1.1.2       NODETYPE_WDM   NODESUBTYHPE_RROADM_2
于 2013-11-12T18:03:41.520 に答える
0

最も簡単な方法は、タブ文字 "\t" を使用することです。ただし、印刷された文字列の長さがタブよりも大きい場合、これが機能することは保証されていません。また、タブの幅は多くの要因に依存します。

必要なことを達成する最善の方法は、各列の最大幅を確認し、必要に応じてスペース文字を追加してレイアウトを美しくすることです。

于 2013-11-12T17:47:24.310 に答える