Java:返回具有非常不同的条目长度的2D数组作为格式化字符串

时间:2013-12-08 19:31:21

标签: java arrays string

我想为Matrix类编写一个toString方法,我需要返回一个包含矩阵的格式化字符串。矩阵中的条目长度差异很大,因此只需用TAB分隔条目就不是技巧。现在我有以下内容:

public String toString(){
    String str = "";
    for(int i=0;i < _dim[0];i++){
        for(int j=0;j < _dim[1];j++){
            str += this.values[i][j] + "\t" + "\t";
        }
        str += "\n";
    }
    return str;
}

这给了我类似的东西。

3.2004951E7     -1.591328E7     17839.0     
-35882.0        17841.0     -20.0       
1794.0  -892.0         1.0

有没有办法打印这些正确对齐而不事先知道每个条目的长度?

感谢。

2 个答案:

答案 0 :(得分:2)

  

有没有办法打印这些正确对齐而不知道   提高每个条目的持续时间?

我认为没有任何可用的内置库函数可以执行此类操作 为了我们。我们必须制作自己的格式,例如:%-xs

  1. 创建一维数组:maxWidth[col]以查找每列的最大宽度:列大小等于2D数组的列数。
  2. 访问2D数组以查找每列的最大宽度
  3. 使用"%-"+maxWidth[col]+"s "为每列创建格式化字符串,其中-指定左对齐格式后的%
  4. 请查看formatting Numeric Print Output了解详情。
  5. 示例代码:

       String data[][] = {{3.2004951E7+"" , -1.591328E7+"",  17839.0+"" },
                          {-35882.0 +"" , -17841.0+"",  -20.0+"" }};
    
    
        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";
    
        System.err.println(format);
    
        for(String[] rowD : data)
        {
            System.out.printf(format, rowD);
        }
    

    <强>输出:

    3.2004951E7   -1.591328E7   17839.0   
    -35882.0      -17841.0      -20.0  
    

答案 1 :(得分:1)

如果您知道最长字符串的长度,可以使用String.format(),我们称之为maxLength

public String toString(){
  String str = "";
  for(int i=0;i < _dim[0];i++){
      for(int j=0;j < _dim[1];j++){
        String value = String.valueOf(this.values[i][j]);
        str += String.format("%1$-" + (max-value.length()) + "s", " ") + value + "\t";
      }
    str += "\n";
  }
  return str;
}