【问题标题】:Printing 2D Arraylist打印二维数组列表
【发布时间】:2026-02-11 12:05:02
【问题描述】:

当我尝试打印 2D ArrayList 时,输出如下所示:

A B CD E FG H I

代替:

A B C
D E F
G H I

在构造函数public DenseBoard(T[][] x, T fillElem)中,我将二维array的元素复制到二维ArrayList中。然后,在toString() 方法中,我循环遍历 2D ArrayList 的元素并输出结果(但我无法得到我上面提到的所需结果)

测试者

public class Tester {

    public static void main(String[] args){

        String[][] myString = {{"A B C"}, {"D E F"}, {"G H I"}};
        DenseBoard<String> temp1 = new DenseBoard<String>(myString, "a");
        System.out.println(temp1);
    }
}

DenseBoard

import java.util.*;
public class DenseBoard <T> {

    private T element;
    private ArrayList<ArrayList<T>> myBoard;

    public DenseBoard(T[][] x, T fillElem){
        this.myBoard = new ArrayList<ArrayList<T>>();
        this.element = fillElem;

        for(int i = 0; i < x.length; i++){
            ArrayList<T> values = new ArrayList<T>();
            for(int j = 0; j < x[i].length; j++){
                values.add(x[i][j]);
            }
            myBoard.add(values);
        }
    }

    public String toString(){
        String result = "";
        for(int i = 0; i < myBoard.size(); i++){
            for(int j = 0; j < myBoard.get(i).size(); j++){
                result += myBoard.get(i).get(j);
            }
            System.out.println();
        }
        return result;
    }
}

【问题讨论】:

    标签: java arraylist tostring


    【解决方案1】:

    在您的 toString 方法中没有println 的位置,因为它的用途是构建一个字符串,而不是向标准输出输出任何内容。
    变化:

     public String toString(){
          String result = "";
          for(int i = 0; i < myBoard.size(); i++){
              for(int j = 0; j < myBoard.get(i).size(); j++){
                  result += myBoard.get(i).get(j);
              }
              System.out.println();
          }
          return result;
      }
    

     public String toString(){
          String result = "";
          for(int i = 0; i < myBoard.size(); i++){
              for(int j = 0; j < myBoard.get(i).size(); j++){
                  result += myBoard.get(i).get(j);
              }
              // System.out.println();
              result += "\n";
          }
          return result;
      }
    

    顺便说一句,如果要频繁调用此方法,请考虑使用 StringBuilder。

    【讨论】:

    • 您能解释一下为什么我不能使用System.out.println() 在这段代码中打印一个新行吗?
    • @Michael:为什么你有toString 方法?不是输出到控制台,而是构建一个字符串。 println 对此没有任何贡献。
    【解决方案2】:

    问题在于您的toString 方法:您永远不会在此处添加换行符。而不是您调用System.out.println();,它打印换行符。

    public String toString(){
        String result = "";
        for(int i = 0; i < myBoard.size(); i++){
            for(int j = 0; j < myBoard.get(i).size(); j++){
                result += myBoard.get(i).get(j);
            }
            result += System.lineSeparator();
        }
        return result;
    }
    

    System.lineSeparator() 返回系统相关的行分隔符字符串。

    请注意,您应该考虑使用StringBuilder,而不是连接到String

    【讨论】:

      【解决方案3】:

      您的 toString 操作正在打印换行符,然后返回字符串表示形式(没有字符串表示)。将System.out.println(); 替换为result += "\n";

      【讨论】:

        【解决方案4】:

        首先我添加了一些日志记录......

        import java.util.*;
        public class DenseBoard <T> {
        private T element;
            private ArrayList<ArrayList<T>> myBoard;
        
         public DenseBoard(T[][] x, T fillElem){
              this.myBoard = new ArrayList<ArrayList<T>>();
              this.element = fillElem;
        
              for(int i = 0; i < x.length; i++){
                 ArrayList<T> values = new ArrayList<T>();
                  for(int j = 0; j < x[i].length; j++){
                      T nextElement = x[i][j];
                      System.err.println(String.format("adding x[%1$d][%2$d] (%3$s)", i, j, nextElement));
                      values.add(x[i][j]);
                  }
                  System.err.println(String.format("added %1$d elements", values.size()));
                  myBoard.add(values);
              }
          }
         public String toString(){
              String result = "";
              for(int i = 0; i < myBoard.size(); i++){
                  for(int j = 0; j < myBoard.get(i).size(); j++){
                      result += myBoard.get(i).get(j);
                  }
                  // replaced the call to System.out.println() with "\n"..
                  result+= "\n";
        
              }
              return result;
          }
        }
        

        在我运行了几次之后,我突然想到它不是作为参数传递给构造函数的二维数组,所以我尝试使用这段代码来修复...

        公共类测试者{

        public static void main(String[] args){

                String[][] myString = {{"A", "B", "C"}, {"D", "E", "F"}, {"G","H", "I"}};
                DenseBoard<String> temp1 = new DenseBoard<String>(myString, "a");
                System.out.println(temp1);
            }
        }
        

        现在我得到的输出...

        $ java Tester
        adding x[0][0] (A)
        adding x[0][1] (B)
        adding x[0][2] (C)
        added 3 elements
        adding x[1][0] (D)
        adding x[1][1] (E)
        adding x[1][2] (F)
        added 3 elements
        adding x[2][0] (G)
        adding x[2][1] (H)
        adding x[2][2] (I)
        added 3 elements
        ABC
        DEF
        GHI
        

        【讨论】: