代码之家  ›  专栏  ›  技术社区  ›  user4833210

toString()表示输出

  •  0
  • user4833210  · 技术社区  · 9 年前

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

    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能帮我吗?错误发生在内部的这一行中 到字符串() 方法:

    1 回复  |  直到 3 年前
        1
  •  1
  •   Sergej Werfel    9 年前

    增加每列的行:

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

    这也是它适用于#rows>=的原因#列,但不适用于#行<#柱

    提取myBoard。get(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);
    }
    

    }