2013-12-07 3 views
1

Привет, ребята, я довольно новичок в java, и у меня возникает эта проблема при попытке добавить числа из файла compact.txt в массив. Вот мой код:Добавление чисел в массив из .txt-файла

public void compactArray(){ 
    try{ 
     Scanner scan = new Scanner(new File("compact.txt")); 
     while(scan.hasNextInt()){ 
      num++; 
     } 
     int [] a = new int[num]; 
     Scanner in = new Scanner(new File("compact.txt")); 
     while(counter < num){ 
      a[counter] = in.nextInt(); 
      counter++; 
     } 
     System.out.println(Arrays.toString(a)); 
    }catch(IOException bob){ 
     bob.getMessage(); 
    } 
} 

Проблема с этим кодом в том, что он никогда не перестает работать. Сначала мой код читает файл compact.txt, а затем подсчитывает количество чисел, которое он должен определить размер массива. Затем я делаю другую переменную сканера, чтобы добавить числа из файла compact.txt в массив. Я использую переменную счетчика как способ остановки, когда желаемое количество чисел добавляется в массив a. Я не слишком уверен, в чем проблема, но он продолжает работать и не попадает в строку, где предполагается распечатать массив. Может кто-то, пожалуйста, помогите мне. Огромное спасибо.

ответ

5

Вы должны позвонить

scan.nextInt(); 

в первом цикле. Вы никогда не двигаете курсором, в результате вы продолжаете читать первый элемент.

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

+0

+1 для ответа на вопрос как есть, и дать подсказку не читать его дважды. –

+0

Если я вызову scan.nextInt() внутри первого цикла, как узнать, сколько элементов в массиве. Например, вам не нужно сначала подсчитывать элементы в массиве, а затем создавать массив и, наконец, добавлять в него элементы? – Bobby

+0

Вы можете сохранить число num ++ для подсчета элемента. Но вам также нужно переместить курсор на следующий элемент, используя scan.nextInt(), чтобы вы могли выйти из цикла –

0

изменение

while(scan.hasNextInt()){ here is the problem, This loop never move to next integer. You need to call to scan.nextInt() required to move next integer 
      num++; 
} 

в

while(scan.hasNextInt()){ 
     scan.nextInt(); 
     num++; 
} 
+0

Большое вам спасибо.Мой код, наконец, работает :). – Bobby

+0

@Bobby приветствуется. – Prabhakaran

1

Вы делаете что-то неправильно там: Вы должны использовать только один Scanner объект для этого.

Более конкретно, что происходит в вашем случае, является следующее: вы проверяете, имеет ли сканер следующий int в while(scan.hasNextInt()){, но вы никогда не читаете этот int. Так что это будет цикл навсегда.

Правильный рабочий код будет:

public void compactArray(){ 
    List<Integer> ints = new ArrayList<>(); 
    try{ 
     Scanner scan = new Scanner(new File("compact.txt")); 
     while(scan.hasNextInt()){ 
      ints.add(in.nextInt()); 
     } 
    }catch(IOException ex){ 
     ex.getMessage(); 
    } 
    System.out.println(Arrays.toString(ints.toArray(new int[ints.size()]))); 
} 

Я также изменил следующие моменты вашего кода:

  • Внутренне теперь List<Integer> используется для хранения целых чисел. Из-за этого больше не нужно делать подсчет!
  • Дал исключение значимое имя.
  • В System.out.println теперь List<Integer> сначала преобразуется в массив, а затем отображается String -представление.
+0

Благодарим вас за подробное объяснение. Теперь я понимаю, почему и мой код работает :). – Bobby

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