#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 — может помочь улучшить ваш код в долгосрочной перспективе). И, наконец, обратите внимание на количество индексов, чтобы переместить позицию в массиве, в который вы вставляете свои строки.