1

I am trying to populate a 2D array in Java through reading a text file using scanner. Currently, I don't fully understand what's going wrong. Below are the text file I'm using, the 2D array when it is printed and my code.

Text File

30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 28 22 23 29 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 28 22 33 9 10 34 23 29 30 30 30 30 30 30 
30 30 30 30 28 22 33 9 17 1 1 18 10 34 23 29 30 30 30 30 
30 30 28 22 33 9 17 1 1 1 1 1 1 18 10 34 23 29 30 30 
28 22 33 9 17 1 1 1 1 1 1 1 1 1 1 18 10 34 23 29 
33 9 17 1 1 2 1 1 1 1 1 1 1 1 6 1 1 18 10 34 
32 8 16 1 1 1 1 1 1 1 1 1 1 1 1 5 1 15 7 31 
27 25 32 8 16 1 1 3 1 1 1 1 1 1 1 15 7 31 24 26 
30 30 27 25 32 8 16 1 1 1 1 1 1 15 7 31 24 26 30 30 
30 30 30 30 27 25 32 8 16 1 1 15 7 31 24 26 30 30 30 30 
30 30 30 30 30 30 27 25 32 8 7 31 24 26 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 27 25 24 26 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30

Printed Array

Map array: [[30, 30, 30, 30, 1, 1, 1, 32, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 30, 10, 1, 1, 16, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 30, 23, 6, 1, 1, 27, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 30, 30, 1, 1, 7, 24, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 30, 28, 10, 7, 24, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 28, 33, 32, 24, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 28, 33, 17, 16, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 23, 17, 1, 1, 27, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 1, 1, 1, 32, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 10, 1, 1, 16, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 23, 1, 1, 1, 27, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 30, 1, 1, 1, 32, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 30, 10, 1, 1, 7, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 30, 23, 1, 7, 24, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 30, 28, 33, 7, 24, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 28, 33, 17, 27, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 33, 17, 1, 32, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 10, 1, 1, 16, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [30, 30, 23, 1, 1, 1, 27, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

Currently, my code reads every integer in a while loop. Whilst the x-coordinate (The x position in the array) increases up to 19 in the array, it is set to zero and the y-coordinate increases (The y position in the array). This is the method I used to populate the array.

Note: The width and height of 2D array (mapWidth and mapHeight) and text file are both 20 * 20. Additionally, the initial value of xCoord and yCoord are 0.

My Code

while (fileScannerTileMap.hasNext()) {

    if (fileScannerTileMap.hasNextInt()) {
        tileMap[xCoord][yCoord] = fileScannerTileMap.nextInt();
    }

    fileScannerTileMap.next();

    // Increase xCoord each time
    xCoord++;

    // When xCoord reaches its max at 19, increase yCoord and set xCoord equal to zero
    if (mapWidth - 1 == xCoord) { 
        yCoord++;
        xCoord = 0;
    }
}

Any help would be appreciated!

EDIT

I want to create a 2D array that matches the text file so I can later reference the values of the 2D array easily in a sprite sheet to create terrain for a 2D game.

So Text File --> 2D array --> Terrain Generation

3
  • 2
    What is the expected output? Commented May 31, 2015 at 13:29
  • The output of the 2D array should be the same as the text file. (I want to replace corresponding values in an array with that of the text file) Sorry for not clearing that up to well! Commented May 31, 2015 at 13:37
  • @Rossw19, you should edit your question to reflect your real need. Commented May 31, 2015 at 14:01

3 Answers 3

2

You are missing some integers because you do next twice: fileScannerTileMap.nextInt(); and fileScannerTileMap.next();

Try that:

if (fileScannerTileMap.hasNextInt()) {
    tileMap[xCoord][yCoord] = fileScannerTileMap.nextInt();
} else {
    fileScannerTileMap.next();
}

And break the loop when you are done:

if (mapWidth - 1 == xCoord) { 
    yCoord++;
    xCoord = 0;

    // add this:
    if (mapWidth - 1 == yCoord) { 
        break;
    }
}
Sign up to request clarification or add additional context in comments.

3 Comments

I seem to be getting an ArrayOutOfBounds Exception, thanks for th help though!
check my update. If that doesn't fix it, please tell us where/when the exception exactly happens
Thanks, it worked. I found that I had another issue that when I took away one from the mapWidth, I was accidentally using the wrong indexes in the 2D array.
1

You can use a little trick for calculating the row and column numbers:

public class Example {

    public static void main(String[] args) {

        // Initialize the scanner
        Scanner scanner = null;
        try {
            scanner = new Scanner(new File("map.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // Reading the values
        int size = 20;
        int[][] map = new int[size][size];
        for (int i = 0; scanner.hasNextInt(); i++) {
            map[i/size][i%size] = scanner.nextInt();
        }

        // Print the array
        for (int i = 0; i < size; i++) {
            System.out.println();
            for (int j = 0; j < size; j++) {
                System.out.print(map[i][j] + " ");
            }
        }
    }
}

I wrote this code in a way that you can just copy-paste and try yourself, but actually you only need the loop for reading the values.

Output:

30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 28 22 23 29 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 28 22 33 9 10 34 23 29 30 30 30 30 30 30 
30 30 30 30 28 22 33 9 17 1 1 18 10 34 23 29 30 30 30 30 
30 30 28 22 33 9 17 1 1 1 1 1 1 18 10 34 23 29 30 30 
28 22 33 9 17 1 1 1 1 1 1 1 1 1 1 18 10 34 23 29 
33 9 17 1 1 2 1 1 1 1 1 1 1 1 6 1 1 18 10 34 
32 8 16 1 1 1 1 1 1 1 1 1 1 1 1 5 1 15 7 31 
27 25 32 8 16 1 1 3 1 1 1 1 1 1 1 15 7 31 24 26 
30 30 27 25 32 8 16 1 1 1 1 1 1 15 7 31 24 26 30 30 
30 30 30 30 27 25 32 8 16 1 1 15 7 31 24 26 30 30 30 30 
30 30 30 30 30 30 27 25 32 8 7 31 24 26 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 27 25 24 26 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 

Comments

0

If your objective is to compare with an existing array, I wouldn't bother creating another 2D array from the file. Instead, I'd just check row by row as and when I read from the file.

This approach has a benefit, readAllLines will close the file handle in case of a NumberFormatException or any other exception.

Let's say int[][] myArray is the original array that you wan't to compare with and the file is located at "filepath". The boolean function compareWithMyArray will return true if your file matches the 2D array.

boolean compareFileWithMyArray(String filepath, int[][] myArray) {
    List<String> lines = Files.readAllLines(Paths.get("filepath")); // Each line is stored as a String in lines.

    int row = 0; //Keeps track of the current row in the 2D array
    for(String str : lines)
    {
        String[] arr = str.split(" "); //The String array now contains each number in the given line as a String
        if(arr.length != myArray[row].length) // Before checking if numbers match, checking lengths is a easy weed out.
            return false;
        for(int i = 0; i < arr.length; i++) // Check if individual numbers match.
            if(Integer.parseInt(arr[i]) != myArray[row][i])
                return false;
        row++; //Move on to the next row if the previous row was a match.
    }

    if(row != lines.size()) // The file could've been a subset of the 2D array, so you want to be sure that all rows matched.
        return false;

    return true; // If all the above tests pass, your file and the 2D array have identical values.
}

3 Comments

Where in the question did you get the idea about comparing?
@user1803551, the OP mentioned it in one of his comments.
I don't see it, but O.K.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.