toString()方法,返回迷宫的字符串表示形式

时间:2015-10-18 18:01:42

标签: java multidimensional-array

我正在尝试编写一个toString()方法,该方法将表示迷宫的2d Char数组转换为字符串表示形式。

public String toString(){
    String s = "";
    for(int i = 0; i < map.length;i++){
        s += Arrays.toString(map[i]);
    }
    return s;
}
public static void main(String[] args){
    Maze maze = new Maze();
    String filename = args[0];
    maze.initializeFromFile(filename);
    String path = maze.findPath();
    map[startRow][startCol] = 'S';
    System.out.println(map.toString());
    System.out.println(path);
}

但这给了我这样的输出。我在这里读到这是指针地址或与内存位置有关,但我不知道该如何处理。当我在Main中使用一个简单的循环来打印每一行时,我可以得到我想要的输出,但每当我尝试使用这种方法时,我总是得到这种输出。

[[C@5c647e05

这是我从文本文件中获得的迷宫。

10 10
##########
#        #
#   ###  #
#   #  G #
#   #    #
#        #
#        #
#  #######
#   S    #
##########

这是我初始化char数组的方法

public class Maze {

public static char[][] map;
public static int startRow;
public static int startCol;
public static int mapHeight;
public static int mapWidth;

public void initializeFromFile(String filename){
    try {
        Scanner scanner = new Scanner(new File(filename));
        mapHeight = scanner.nextInt();
        mapWidth = scanner.nextInt();
        scanner.nextLine();
        map = new char[mapHeight][mapWidth];
        for(int i = 0; i < map.length;i++){
            String line = scanner.nextLine();
            map[i] = line.toCharArray();
            for(int j = 0; j < map[i].length;j++){
                if(map[i][j] == 'S'){
                    startRow = i;
                    startCol = j;
                }
            }
        }
        scanner.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

2 个答案:

答案 0 :(得分:0)

如果使用toString打印java数组,则只打印数组的id。如果你使用的Arrays.toString(map)会更像你想要的那样。

听起来在这种情况下你实际上需要Arrays.deepToString(map),因为你有嵌套数组。

http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#deepToString(java.lang.Object[])

答案 1 :(得分:0)

您可以使用Arrays.deepToString(2dArray),但打印输出将是单行输出。

如果您希望打印输出为2D(表格形式),您可以考虑覆盖Maze类的toString方法(因为您无法覆盖2D数组 - 地图)。

class Maze(){
    @Override
    public String toString(){
        StringBuilder sb = new StringBuilder();
        for(int x=0; x<map.length; x++){
            for(int y=0; y<map[0].length; y++)
                sb.append(map[x][y]);
            sb.append("\n");
        }
        return sb.toString();
    }
}

打印地图:

而不是System.out.println(map.toString());,只需打印由maze支持的map

System.out.println(maze);