2016-03-18 4 views
1

Так я просматривал это на некоторое время и не могу получить по этому вопросу ...Java 2D массива печать Выпуск

В принципе, есть TXT-файл, который входит пользователь (макс 50 строк и 20 целых чисел в каждом), и я преобразовываю это в 2D int[][].

Итак, если вход:

1 2 3 4 5 6 
54 67 66 
45 
34 54 2 

2D-массив должен выглядеть следующим образом:

1 2 3 4 5 6 
54 67 66 0 0 0 
45 0 0 0 0 0 
34 54 2 0 0 0 

В настоящее время я получаю следующий результат:

[1, 2, 3, 4, 5, 6, 54, 67, 66, 45, 2, 3, 34, 54, 2, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

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

Вот мой код (функции класса):

package com.company; 

import java.io.File; 
import java.util.Scanner; 

public class Functions { 
    public int[][] readFile(File file) { 

     try { 

      Scanner scn = new Scanner(file); 
      Scanner scn2 = new Scanner(file); 

      //set initial count (of rows) to zero 
      int maxrows = 0; 

      //sets columns to 20 (every row has 20 integers - filled w zeros if not 20 inputted) 
      int maxcolumns = 20; 

      // goes through file and counts number of rows to set array parameters 
      while (scn.hasNextLine()) { 
       maxrows++; 
       scn.nextLine(); 
      } 

       // create array of counted size 
       int[][] array = new int[maxrows][maxcolumns]; 

       //new scanner to reset 
       Scanner scan1 = new Scanner(file); 

       //places integer one by one into array 
       for (int row = 0; row < maxrows; row++) 
        for (int column = 0; column < maxcolumns; column++) { 
         if (scan1.hasNext()) 
          array[row][column] = scan1.nextInt(); 
         else { 
          break; 
         } 
        } 
       return array; 
     } 
     // general exception 
     catch(Exception e){ 
      System.out.println("PROBLEM"); 
      e.printStackTrace(); 
      //returns null array 
      return null; 

     } 

    } 
} 

Главный класс:

package com.company; 

import java.io.*; 
import java.io.IOException; 
import java.util.Arrays; 
import java.io.File; 



public class Main { 
    public static void main(String[] args) throws IOException { 
     //Creates new class2 object 
     Functions o = new Functions(); 
     //Creates new file object 
     File file = new File("src/com/company/UserInput"); 
     //Takes in file object as parameter 
     int[][] array = o.readFile(file); 

     //prints as an array 
     for (int i=0; i < array.length; i++) 
      System.out.println(Arrays.toString(array[i])); 
    } 
} 
+0

why' 2 0 0 0 0 0'? –

+0

Подсказка: не используйте статическую сеть для проверки кода. Узнайте о Junit; и написать единичные тесты. – GhostCat

+0

@FastSnail Спасибо, что поймали это! Это была всего лишь типография. Раньше у меня был другой массив. –

ответ

3

Проблема заключается в:

for (int row = 0 ; row < maxrows ; row++) { 
    for (int column = 0 ; column < maxcolumns ; column++) { 
     if (scan1.hasNext()) // ← *here* 
      array[row][column] = scan.nextInt(); 
     else { 
      break; 
     } 
    } 
} 

scan1.hasNext() не остановится в конце строка, она вернет true, пока не исчерпает весь файл. Вместо этого вы должны сделать что-то вроде этого:

for (int row = 0 ; row < maxrows ; row++) { 
    Scanner lineScan = new Scanner(scan1.nextLine()); 

    for (int column = 0 ; lineScan.hasNextInt() ; column++) { 
     array[row][column] = lineScan.nextInt(); 
    } 
} 
+0

Большое вам спасибо! –

0

При использовании «scan1.nextInt();» вы пренебрегая новую линию, потому что, все в той же строке. Что вы можете сделать, это использовать:

Scanner scan1 = new Scanner(file).useDelimiter("\\||\\n"); 
while (scan1.hasNext()) { 
       String nextValue = scan1.next(); 
       System.out.println("nextValue " + nextValue); 
} 

Их у вас есть: nextValue 1 2 3 4 5 6 nextValue 54 67 66 nextValue 45 nextValue 34 54 2

Вы можете разбить эту строку и выполните ручное управление

Смежные вопросы