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

Java:以格式化字符串的形式返回具有非常不同的条目长度的2D数组,java,arrays,string,Java,Arrays,String,我想为矩阵类编写一个toString方法,其中我需要返回一个包含矩阵的格式化字符串。矩阵中的条目在长度上非常不同,因此仅使用选项卡来分隔条目并不是关键。现在我有以下几点: 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] +

我想为矩阵类编写一个
toString
方法,其中我需要返回一个包含矩阵的格式化字符串。矩阵中的条目在长度上非常不同,因此仅使用
选项卡来分隔条目并不是关键。现在我有以下几点:

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;
}
有没有一种方法可以在不预先知道每个条目的长度的情况下打印这些正确对齐的条目

谢谢

有没有一种方法可以在不知道的情况下正确对齐打印这些内容 提前知道每个条目需要多长时间

我不认为有任何内置的库函数可以做这样的事情 对我们来说。我们必须使用:
%-xs
:

  • 创建一维数组:
    maxWidth[col]
    查找每列的最大宽度:列大小等于二维数组的列数
  • 访问二维数组以查找每列的最大宽度
  • 使用
    “%-”+maxWidth[col]+“s”
    为每列创建格式字符串,其中
    -
    后面的
    %
    指定左对齐的格式
  • 有关更多详细信息,请查看
  • 示例代码:

       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);
        }
    

    您可以使用
    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;
    }
    
    公共字符串toString(){
    字符串str=“”;
    对于(int i=0;i<_dim[0];i++){
    对于(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”;
    }
    返回str;
    }
    
    但问题不在于不知道长度吗?您可以在创建stringOk之前先找到它。我首先遍历了数组,得到了一个条目的最大长度,该条语句位于相同的两个for循环中:
    length=String.valueOf(this.values[I][j]).length();如果(长度>最大长度)最大长度=长度
    并将
    (max value.length())
    替换为
    (maxLength)
    ,这使它变得更好,但并不完美。
    3.2004951E7   -1.591328E7   17839.0   
    -35882.0      -17841.0      -20.0  
    
    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;
    }