2015-10-21 4 views
0

Im пытается распечатать сетку точек и Xs, которые читаются из текстового файла, но по какой-то причине она просто берет одну из точек и снова добавляет ее в массив снова, вместо того, чтобы читать каждый отдельный символ и добавление этого массива в соответствующее место. Как я могу это исправить?Array добавляет один и тот же символ повторно?

Код:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.Arrays; 
import java.util.Scanner; 

public class Project4 { 

    public static void main(String[] args) throws IOException { 
     Scanner input = new Scanner(System.in); // Created a scanner 
     System.out.println("Enter the file name you would like to use"); 
     File file = new File(input.nextLine()); // Takes file name to find file 
     Scanner inputFromFile = new Scanner(file); 
     FileInputStream fileInput = new FileInputStream(file); // reads file 
     int r; 
     while ((r = fileInput.read()) != -1) { // goes through each character in 
               // file, char by char 
      char c = (char) r; 
      for (int i = 0; i < 25; i++) { 
       for (int y = 0; y < 75 ; y++) { // Adds file values to Array 
        GameOfLife.grid[i][y] = c; 
       } 
      } 
     } 
     // Prints the initial environment 
     System.out.println("Initial set: "); 
     for (int j = 0; j < GameOfLife.grid.length; j++) 
      System.out.println(GameOfLife.grid[j]); 
    } 
} 

GameOfLife:

import java.util.Arrays; 

public class GameOfLife { 

static final int m = 25; // number of rows 
static final int n = 75; // number of columns 
static char[][] grid = new char [m][n]; // Creates an empty (no dots or X's)grid of rows and columns. 

} 

Для примера:

Ожидаемые результаты: Expected output

Actual output

+0

Ваш цикл for внутри вас, поэтому вы прокручиваете «сетку» и переопределяете все его значения символом, который вы читаете каждый раз, когда вы читаете 1 символ. – dguay

ответ

1

Рассмотрим этот блок

while ((r = fileInput.read()) != -1) { // goes through each character in 
              // file, char by char 
     char c = (char) r; 
     for (int i = 0; i < 25; i++) { 
      for (int y = 0; y < 75 ; y++) { // Adds file values to Array 
       GameOfLife.grid[i][y] = c; 
      } 
     } 
    } 

Каждый раз, когда вы читаете характер, она будет проходить через и перезаписать каждую ячейку с этим символом, то есть он будет содержать только то, что символ читается последним.

Если вы хотите, чтобы отслеживать ваши координаты, как вы читаете, удалите для лупов, как такой

int y = 0; 
    int i = 0; 
    while ((r = fileInput.read()) != -1) { // goes through each character in 
              // file, char by char 
     char c = (char) r; 
     GameOfLife.grid[i][y] = c; 
     y++; 
     if (y == 75) 
     { 
      y = 0; 
      ++i; 
      if (i == 25) 
      { 
       break; 
      } 
     } 
    } 
+0

Как я могу заменить инициализированные значения i и y? –

+0

Я не уверен, что вы имеете в виду, можете ли вы уточнить? – user2085282

0

Это центральный for петля проблема. Как уже упоминалось, каждый символ читается в каждой позиции в 2D-массиве. Вы также можете реализовать его таким образом:

FileInputStream fileInput = new FileInputStream(file); // reads file 
    int r;             // file, char by char 
    for (int i = 0; i < 25; i++) { 
     for (int y = 0; y < 75 ; y++) { // Adds file values to Array 
      r = fileInput.read()) != -1; // goes through each character in 
      if(r == -1) break; 
      char c = (char) r; 
      GameOfLife.grid[i][y] = c; 
     } 
    } 

Что лучше, я не уверен. Таким образом, сохраняется знакомая структура вложенного цикла с массивом, но он может выйти раньше, если конец файла заканчивается, что может вызвать ошибки, если вход действительно заканчивается неожиданно.

0

Вы заполняете весь массив каждым символом, потому что вы вложили свои петли. Я думаю, вы должны инициализировать свой grid до '.' (так как это кажется пустым).

Нет необходимости в отдельном классе, чтобы содержать массив, я бы сделал его локальной переменной, если вы не намерены переместить в него больше функциональности (но тогда все не должно быть static). Я предлагаю вам использовать try-with-resources, чтобы избежать утечки файлов. Затем я буду использовать Scanner для чтения файла по одной строке за раз (пропуская пустые строки и недопустимые символы). И вы можете использовать Arrays.deepToString(Object[]) для печати grid. Что-то наподобие

final int m = 25; 
final int n = 75; 
char[][] grid = new char[m][n]; 
for (char[] arr : grid) { // <-- start with an empty grid. 
    Arrays.fill(arr, '.'); 
} 
Scanner input = new Scanner(System.in); 
System.out.println("Enter the file name you would like to use"); 
File file = new File(input.nextLine()); 
try (Scanner inputFromFile = new Scanner(file)) { 
    int row = 0; 
    while (inputFromFile.hasNextLine()) { 
     String line = inputFromFile.nextLine().trim(); 
     if (line.isEmpty()) { 
      continue; 
     } 
     for (int i = 0; i < n; i++) { 
      char ch = i < line.length() ? line.charAt(i) : ' '; 
      if (ch != '.' && ch != 'x') { 
       continue; 
      } 
      grid[row][i] = ch; 
     } 
     row++; 
    } 
    // Prints the initial environment 
    System.out.println("Initial set: "); 
    System.out.println(Arrays.deepToString(grid)); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
Смежные вопросы