从外部文件读取行并在数组中存储元素

时间:2016-10-10 23:43:20

标签: java arrays

我是新来的,所以请耐心等待。我试图从外部文件读取数据并将信息存储在2个数组中。 该文件如下所示:

0069     723.50 
0085     1500.00
0091     8237.31

我使用2个扫描仪来读取输入,我认为它们正常工作,因为当我尝试打印时,结果看起来不错。 我的第一个问题是我能够使用nextInt()读取列表中的第一个数字,但是当我得到“java.util.InputMismatchException”消息时,不能使用nextDouble()作为double。出于这个原因,我把它读作一个字符串。对于不同的输入文件,与其他两个扫描仪的部件应该做第一部分应该做的事情,但问题是相同的。 到目前为止,我的下一个也是最大的问题是,无法将两列中的值存储在两个不同的数组中。我尝试了几种方式(所有评论)但都失败了。请帮助和谢谢。 这是我的代码:

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("%04d ",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("%04d \n",accounts_array[j]);
                }*/


            String balance = accountsFile.nextLine();                       //problem declaring balance as a double
            out.printf("%s\n",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("%04d \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("%04d ",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("%s\n",amount);
        }

    }

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


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

2 个答案:

答案 0 :(得分:0)

InputMismatchException因为您尝试使用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("%04d\t%.2f\n", Integer.parseInt(intArr[i].toString()),
                       Double.parseDouble(doubleArr[i].toString()));

输出

0069    723.50
0085    1500.00
0091    8237.31

答案 1 :(得分:0)

首先,您不需要使用2个扫描仪。 Scanner对象只是读取您的文件,一台扫描仪可以完成读取文件的任务。

如果您正在尝试从文件中读取整数/双精度并且遇到nextInt()和nextDouble()时遇到问题,请考虑使用不同的解析方法(例如,将该行解析为字符串,将该行拆分为2部分基于空格字符,然后修剪两个结果字符串并转换为相应的整数/双精度。)

现在回到扫描程序解析这两个值,首先记住当你使用next()或nextInt()等时,这些方法会使用下一个相应的标记。因此,将一行作为字符串从文件解析为另一个Scanner对象是多余的,在这种情况下是不必要的。

如果您知道自己的最大帐户数量,并且只是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("%04d ", account);
            accounts_array[currentIndex] = account;
            //out.printf("%s\n", balance);
            balance_array[currentIndex] = balance;
            currentIndex++;
        }
        balanceFile.close();
    }
    static void start() {
        readFiles();
    }
    public static void main(String[] args) {
        start();
    }
}

请注意,将来也可以避免过度使用静电,但为了示例,它会像瘟疫一样传播。

正如您在导致while循环的逻辑中所看到的那样,扫描程序对象是由我将示例数据复制到桌面上的文件中的文件构成的。数组在while循环之前分配(注意:请参阅@progy_rock及其对ArrayList的使用 - 从长远来看可能有助于改进代码)。最后,记下索引计数,以便在插入行的数组中移动位置。