有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java toString()表示输出

我的代码中有一个bug,相信我,我已经多次运行调试来找出代码的错误,但无法理解错误所在。我必须输出2d Arraylist的内容。例如,如果我这样做:

Board<String> board = new Board<String>(-4,1,-2,3,"A"); 
System.out.println(board);

它向我输出以下内容:

   | -2| -1|  0|  1|  2|  3|
   +---+---+---+---+---+---+
-4 |  A|  A|  A|  A|  A|  A|
   +---+---+---+---+---+---+
-3 |  A|  A|  A|  A|  A|  A|
   +---+---+---+---+---+---+
-2 |  A|  A|  A|  A|  A|  A|
   +---+---+---+---+---+---+
-1 |  A|  A|  A|  A|  A|  A|
   +---+---+---+---+---+---+
 0 |  A|  A|  A|  A|  A|  A|
   +---+---+---+---+---+---+
 1 |  A|  A|  A|  A|  A|  A|
   +---+---+---+---+---+---+

但是,当我将第四个值3更改为更大的数字,例如4(-4,1,-2,4,"A"))时,它会说:

 java.lang.IndexOutOfBoundsException: Index: 6, Size: 6

我所有的构造函数都工作得很好,我假设错误在toString()方法中。再一次,我试着调试了好几次,但仍然不能确定这里会出什么问题。smb能帮我吗?错误发生在toString()方法内的这一行:


共 (1) 个答案

  1. # 1 楼答案

    增加每列的行数:

    for(int j = minCol; j <= maxCol; j++){
        secondLine1 += "|  " + myBoard.get(row++).get(col++);
        secondLine2 += "+ -";
    }
    

    这也是为什么它适用于#rows>;=#列,但不适用于#行<#纵队

    拔出我的黑板。在内部for循环之前获取(row++)作为变量,如

     ArrayList<T> rowCells = myBoard.get(row++);
     for(int j = minCol; j <= maxCol; j++){
           secondLine1 += "|  " + rowCells.get(col++);
           secondLine2 += "+ -";
     }
    

    然后行动

    row = 0;
    

    走出外环

    或者,这里是对整个类的一个建议(请注意,我只改进了索引访问。还有足够的空间进行进一步改进,例如字符串连接):

    public class Board<T> {
    private T element;
    private int minCol;
    private int maxCol;
    private int minRow;
    private int maxRow;
    private int rowCount;
    private int colCount;
    private List<List<T>> myBoard;
    
    public Board(int minRow, int maxRow, int minCol, int maxCol, T fillElem) {
        this.minRow = minRow;
        this.maxRow = maxRow;
        this.minCol = minCol;
        this.maxCol = maxCol;
        this.rowCount = maxRow - minRow + 1;
        this.colCount = maxCol - minCol + 1;
    
        if (fillElem == null) {
            throw new RuntimeException("Cannot set elements to null");
        } else {
            this.element = fillElem;
        }
    
        myBoard = new ArrayList<List<T>>(rowCount);
        for (int i = 0; i < rowCount; i++) {
            List<T> rowLine = new ArrayList<T>(colCount);
            myBoard.add(rowLine);
            for (int j = 0; j < colCount; j++)
                rowLine.add(element);
        }
    }
    
    private T getCellValueAt(int row, int column) {
        return myBoard.get(row - minRow).get(column - minCol);
    }
    
    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        String result = "";
        if (this.element instanceof String) {
            String elem = (String) this.element;
            String firstLine1 = "   ";
            String firstLine2 = "   ";
            String first1 = "";
            String first2 = "";
            String secondLine1 = "";
            String secondLine2 = "   ";
    
            switch (elem.length()) {
            case 1:
                result = "";
                // Contructs the first two lines!
                firstLine1 = "   ";
                firstLine2 = "   ";
                first1 = "";
                first2 = "";
                for (int i = 0; i < colCount; i++) {
                    if (i >= 0) {
                        first1 += "|  " + i;
                    } else {
                        first1 += "| " + i;
                    }
                    first2 += "+ -";
                }
                firstLine1 += first1 + "|\n";
                firstLine2 += first2 + "+\n";
    
                // Constrcuts the rest!
                secondLine1 = "";
                secondLine2 = "   ";
    
                for (int row = minRow; row <= maxRow; row++) {
                    if (row >= 0) {
                        secondLine1 += " " + row + " ";
                    } else {
                        secondLine1 += row + " ";
                    }
    
                    for (int column = minCol; column <= maxCol; column++) {
                        secondLine1 += "|  " + getCellValueAt(row, column);
                        secondLine2 += "+ -";
                    }
                    secondLine1 += "|\n";
                    secondLine1 += secondLine2 + "+\n";
                    secondLine2 = "   ";
    
                    // secondLine2 += "+\n   ";
                }
    
                result += firstLine1 + firstLine2 + secondLine1; // + secondLine2;
                break;
            }
            return builder.append(result).toString();
        }
        return "";
    }
    
    public static void main(String[] args) {
        Board<String> board = new Board<String>(-4, 1, -2, 4, "A");
        System.out.println(board);
    }
    

    }