чтение строк из внешнего файла и сохранение элементов в массиве

#java #arrays

#java #массивы

Вопрос:

Я здесь новичок, поэтому, пожалуйста, проявите немного терпения. Я пытаюсь прочитать данные из внешнего файла и сохранить информацию в 2 массивах. Файл выглядит следующим образом:

 0069     723.50 
0085     1500.00
0091     8237.31
  

Я использую 2 сканера для считывания входных данных, и я думаю, что они работают нормально, потому что, когда я пытаюсь напечатать, результат выглядит нормально.
Моя первая проблема заключается в том, что я могу прочитать первые числа в списке с помощью nextInt(), но не могу использовать nextDouble() для двойных чисел, поскольку я получаю «java.util.Сообщение «InputMismatchException». По этой причине я читаю его как Строку. Предполагается, что часть с двумя другими сканерами будет делать то же, что и первые части, для другого входного файла, но проблема та же.
Моя следующая и самая большая проблема, до сих пор, заключается в том, что я не могу хранить значения из двух столбцов в двух разных массивах. Я пробовал несколько способов (все прокомментировал), но все они терпят неудачу. Пожалуйста, помогите и спасибо.
Вот мой код:

 import ui.UserInterfaceFactory;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.Scanner;
import ui.UIAuxiliaryMethods;

public class Bank {
    static final int MAX_NUMBER_OF_ACCOUNTS = 50;

    PrintStream out;

    Bank(){
        UserInterfaceFactory.enableLowResolution(true);
        out = new PrintStream(System.out);
    }

    void readFiles(){
        Scanner balanceFile = UIAuxiliaryMethods.askUserForInput().getScanner();
        while(balanceFile.hasNextLine()){
            String balance_Line = balanceFile.nextLine();
            Scanner accountsFile = new Scanner(balance_Line);

            int account = accountsFile.nextInt();                       //works
            out.printf("d ",account);


            /*int [] accounts_array = new int [MAX_NUMBER_OF_ACCOUNTS];         //does not store the values properly
            int account = accountsFile.nextInt();
            for(int j=0; j < accounts_array.length; j  ){

                accounts_array[j] = account;

            }*/

            /*int [] accounts_array = new int [MAX_NUMBER_OF_ACCOUNTS];         //java.util.InputMismatchException
                for(int j=0; j < accounts_array.length; j  ){

                    accounts_array[j] = accountsFile.nextInt();
                    //out.printf("d n",accounts_array[j]);
                }*/


            String balance = accountsFile.nextLine();                       //problem declaring balance as a double
            out.printf("%sn",balance);

            /*String [] balance_array = new String [MAX_NUMBER_OF_ACCOUNTS];            //java.util.NoSuchElementException
            for(int j=0; j < balance_array.length; j  ){
                accountsFile.useDelimiter(" ");

                balance_array[j] = accountsFile.next();
                //out.printf("d n",accounts_array[j]);
            }*/
        }

        Scanner mutationsFile = UIAuxiliaryMethods.askUserForInput().getScanner();
        while(mutationsFile.hasNext()){

            String mutation_Line = mutationsFile.nextLine();
            Scanner mutatedAccountsFile = new Scanner(mutation_Line);


            int mutated_account = mutatedAccountsFile.nextInt();
            out.printf("d ",mutated_account);


            int action = mutatedAccountsFile.nextInt();     //deposit or withdrawal
            /*if (action == 1){

            }else{

            }*/
            out.printf(" %d ",action);

            /*Double amount = mutatedAccountsFile.nextDouble();
            out.printf(" %5.2f ",amount);*/
            String amount = mutatedAccountsFile.nextLine();
            out.printf("%sn",amount);
        }

    }

    void start(){
        new Bank();readFiles();
    }


    public static void main(String[] args) {
        new Bank().start();
    }
}   
  

Комментарии:

1. Опубликуйте полное сообщение об ошибке.

Ответ №1:

Это InputMismatchException происходит потому, что вы пытаетесь прочитать double с помощью nextInt() функции. Чтобы решить эту проблему, вы можете сначала прочитать токены как строки с помощью next() функции и соответствующим образом преобразовать их.

 while(mutationsFile.hasNext()){
    mutation_Line = mutationsFile.next();
    if(mutation_Line.indexOf(".") == -1)
        //token is int
    else
        //token is double
}
  

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

 List<Integer> intList = new ArrayList<Integer>();
List<Double> doubleList = new ArrayList<Double>();
  

Теперь замените операторы if в первом фрагменте следующим образом:

 if(mutation_Line.indexOf(".") == -1)
    intList.add(new Integer(Integer.parseInt(mutation_Line)));
else
    doubleList.add(new Double(Double.parseDouble(mutation_Line)));
  

В конце концов, вы можете получить их в массивы:

 Object[] intArr = intList.toArray(),
         doubleArr = doubleList.toArray();
//display the contents:
for(int i=0; i<intArr.length; i  )
out.printf("dt%.2fn", Integer.parseInt(intArr[i].toString()),
                       Double.parseDouble(doubleArr[i].toString()));
  

ВЫВОД:

 0069    723.50
0085    1500.00
0091    8237.31
  

Ответ №2:

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

Если вы пытаетесь прочитать целые числа / удвоения из файла и у вас возникают проблемы с nextInt() и nextDouble(), рассмотрите другой подход к синтаксическому анализу (например, разобрать строку в строку, разделить строку на 2 части на основе символа пробела, затем обрезать обе результирующие строки и преобразовать всоответствующие целые числа / удвоения).

Теперь вернемся к сканеру, анализирующему два значения, сначала помните, что при использовании next() или nextInt() и т. Д. эти методы используют следующий соответствующий токен. Таким образом, синтаксический анализ строки как строки из файла в другой объект сканера в этом случае является избыточным и ненужным.

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

Вот альтернативный подход с опубликованным вами кодом.

 public class App {
    static int MAX_NUMBER_OF_ACCOUNTS = 50;
    static PrintStream out;
    static void readFiles() {
        Scanner balanceFile = null;
        try {
            balanceFile = new Scanner(new File("C:\Users\Nick\Desktop\test.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        if (balanceFile == null)
            return;
        int [] accounts_array = new int [MAX_NUMBER_OF_ACCOUNTS];
        double [] balance_array = new double [MAX_NUMBER_OF_ACCOUNTS];
        int currentIndex = 0;
        while (balanceFile.hasNextLine()) {
            int account = balanceFile.nextInt();
            double balance = balanceFile.nextDouble();
            System.out.print("acc = "   account   " ");
            System.out.println("bal = "   balance);
            //out.printf("d ", account);
            accounts_array[currentIndex] = account;
            //out.printf("%sn", balance);
            balance_array[currentIndex] = balance;
            currentIndex  ;
        }
        balanceFile.close();
    }
    static void start() {
        readFiles();
    }
    public static void main(String[] args) {
        start();
    }
}
  

Пожалуйста, обратите внимание, что чрезмерного использования static также можно было бы избежать в будущем, но ради примера он распространился как чума.

Как вы можете видеть в логике, ведущей к while циклу, объект scanner создается из файла, который я скопировал из вашего примера данных в файл на моем рабочем столе. Массивы выделяются перед while циклом (примечание: см. @progy_rock и их использование ArrayList — может помочь улучшить ваш код в долгосрочной перспективе). И, наконец, обратите внимание на количество индексов, чтобы переместить позицию в массиве, в который вы вставляете свои строки.