Read .txt file into 2D Array

前端 未结 4 1646
甜味超标
甜味超标 2020-11-28 12:21

There are a few of these topics out there, but this problem has a slight twist that makes it different.

I\'m focused on only half of a larger problem. I\'m sure man

相关标签:
4条回答
  • 2020-11-28 12:46

    You're close, but change your while loop to look like the following:

    while (in.hasNextLine()) {
        Scanner lineIn = new Scanner(line);
        //The initial case - this first line is used to determine the size of the array
        if(lineIn.hasNext()) {
            //Create a String array by splitting by spaces
            String[] s = lineIn.nextLine().split(" ");
            //Reinitialize the array to hold all of your subarrays
            matrix = new int[s.length];
            for (int i = 0; i < s.length; i++) {
                //Reinitialize each subarray to hold the numbers
                matrix[i] = new int[i];
                //Finally, parse your data from the String array
                matrix[0][i] = Integer.parseInt(s[i]);
            }
        }
        //Repeat the steps now that all of your arrays have been initialized
        for (int j = 1; j < matrix.length; j++) {
            String[] s = lineIn.nextLine().split(" ");
            for (int i = 0; i < s.length; i++) {
                matrix[j][i] = Integer.parseInt(s[i]);
            }
        }
    }
    

    The biggest change that you can make to make this easier on yourself is to get your numbers line-by-line. With each line you get, it's easy to then split it into a String array so that you can parse each number separately. Doing it this way you can then get the full length of the array all at once without having to have troublesome counters.

    0 讨论(0)
  • 2020-11-28 12:49

    With Java 8 and it's Streams:

      static public int[][] create2DIntMatrixFromFile(Path path) throws IOException {
        return Files.lines(path)
          .map((l)->l.trim().split("\\s+"))
          .map((sa)->Stream.of(sa).mapToInt(Integer::parseInt).toArray())
          .toArray(int[][]::new);
      }
    

    This is just for the 'reading' part of the question.

    0 讨论(0)
  • 2020-11-28 13:05

    First, test out the Scanner results. I don't think those delimiters will work. (BTW, Scanner's nextInt() method is handy.)

    If you can assume the input is a square matrix, scanning the first line will reveal how many integers it contains. Then you can (re)allocate the arrays. Then process all the lines, including the first line that you already scanned.

    Then you can set matrix = new int[n][n];

    0 讨论(0)
  • 2020-11-28 13:06

    I produced the following 2D array from the file you provided:

     37 | 48 | 59 | 70 | 81 |  2 | 13 | 24 | 35
    ----+----+----+----+----+----+----+----+----
     36 | 38 | 49 | 60 | 71 | 73 |  3 | 14 | 25
    ----+----+----+----+----+----+----+----+----
     26 | 28 | 39 | 50 | 61 | 72 | 74 |  4 | 15
    ----+----+----+----+----+----+----+----+----
     16 | 27 | 29 | 40 | 51 | 62 | 64 | 75 |  5
    ----+----+----+----+----+----+----+----+----
      6 | 17 | 19 | 30 | 41 | 52 | 63 | 65 | 76
    ----+----+----+----+----+----+----+----+----
     77 |  7 | 18 | 20 | 31 | 42 | 53 | 55 | 66
    ----+----+----+----+----+----+----+----+----
     67 | 78 |  8 | 10 | 21 | 32 | 43 | 54 | 56
    ----+----+----+----+----+----+----+----+----
     57 | 68 | 79 |  9 | 11 | 22 | 33 | 44 | 46
    ----+----+----+----+----+----+----+----+----
     47 | 58 | 69 | 80 |  1 | 12 | 23 | 34 | 45
    

    The array figures out the size of the square when it reads the first line of the file. This is very dynamic. Its works as long as the input file is a perfect square. I have no further error handling.

    Here is a simple approach which should adhere to your guidelines.

    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    
    public class ReadMagicSquare {
        public static int[][] create2DIntMatrixFromFile(String filename) throws Exception {
            int[][] matrix = null;
    
            // If included in an Eclipse project.
            InputStream stream = ClassLoader.getSystemResourceAsStream(filename);
            BufferedReader buffer = new BufferedReader(new InputStreamReader(stream));
    
            // If in the same directory - Probably in your case...
            // Just comment out the 2 lines above this and uncomment the line
            // that follows.
            //BufferedReader buffer = new BufferedReader(new FileReader(filename));
    
            String line;
            int row = 0;
            int size = 0;
    
            while ((line = buffer.readLine()) != null) {
                String[] vals = line.trim().split("\\s+");
    
                // Lazy instantiation.
                if (matrix == null) {
                    size = vals.length;
                    matrix = new int[size][size];
                }
    
                for (int col = 0; col < size; col++) {
                    matrix[row][col] = Integer.parseInt(vals[col]);
                }
    
                row++;
            }
    
            return matrix;
        }
    
        public static void printMatrix(int[][] matrix) {
            String str = "";
            int size = matrix.length;
    
            if (matrix != null) {
                for (int row = 0; row < size; row++) {
                    str += " ";
                    for (int col = 0; col < size; col++) {
                        str += String.format("%2d",  matrix[row][col]);
                        if (col < size - 1) {
                            str += " | ";
                        }
                    }
                    if (row < size - 1) {
                        str += "\n";
                        for (int col = 0; col < size; col++) {
                            for (int i = 0; i < 4; i++) {
                                str += "-";
                            }
                            if (col < size - 1) {
                                str += "+";
                            }
                        }
                        str += "\n";
                    } else {
                        str += "\n";
                    }
                }
            }
    
            System.out.println(str);
        }
    
        public static void main(String[] args) {
            int[][] matrix = null;
    
            try {
                matrix = create2DIntMatrixFromFile("square.txt");
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            printMatrix(matrix);
        }
    }
    

    This approach is more refined and optimized.

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    
    public class ReadMagicSquare {
    
        private int[][] matrix;
        private int size = -1;
        private int log10 = 0;
        private String numberFormat;
    
        public ReadMagicSquare(String filename) {
            try {
                readFile(filename);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public void readFile(String filename) throws IOException {
            // If included in an Eclipse project.
            InputStream stream = ClassLoader.getSystemResourceAsStream(filename);
            BufferedReader buffer = new BufferedReader(new InputStreamReader(stream));
    
            // If in the same directory - Probably in your case...
            // Just comment out the 2 lines above this and uncomment the line
            // that follows.
            //BufferedReader buffer = new BufferedReader(new FileReader(filename));
    
            String line;
            int row = 0;
    
            while ((line = buffer.readLine()) != null) {
                String[] vals = line.trim().split("\\s+");
    
                // Lazy instantiation.
                if (matrix == null) {
                    size = vals.length;
                    matrix = new int[size][size];
                    log10 = (int) Math.floor(Math.log10(size * size)) + 1;
                    numberFormat = String.format("%%%dd", log10);
                }
    
                for (int col = 0; col < size; col++) {
                    matrix[row][col] = Integer.parseInt(vals[col]);
                }
    
                row++;
            }
        }
    
        @Override
        public String toString() {
            StringBuffer buff = new StringBuffer();
    
            if (matrix != null) {
                for (int row = 0; row < size; row++) {
                    buff.append(" ");
                    for (int col = 0; col < size; col++) {
                        buff.append(String.format(numberFormat,  matrix[row][col]));
                        if (col < size - 1) {
                            buff.append(" | ");
                        }
                    }
                    if (row < size - 1) {
                        buff.append("\n");
                        for (int col = 0; col < size; col++) {
                            for (int i = 0; i <= log10 + 1; i++) {
                                buff.append("-");
                            }
                            if (col < size - 1) {
                                buff.append("+");
                            }
                        }
                        buff.append("\n");
                    } else {
                        buff.append("\n");
                    }
                }
            }
    
            return buff.toString();
        }
    
        public static void main(String[] args) {
            ReadMagicSquare square = new ReadMagicSquare("square.txt");
            System.out.println(square.toString());
        }
    }
    
    0 讨论(0)
提交回复
热议问题