从文件扫描程序到数组

时间:2013-12-10 00:00:26

标签: java arrays java.util.scanner

我想请求一些有关此代码的帮助。 我没有问题阅读文件本身并将其用作扫描仪。 我可以轻松计算文件的双打数量。 作为示例,这些是txt文件的前五个双打。 (这些数字被认为是垂直列出的,但我几乎不怀疑它会有所作为)

  

10 84 39 93 34

我想将这些双打放入一个数组中,但出于某种原因而不是将扫描器中的双精度放入数组中,Java只会输入0.0。

 Scanner in = new Scanner(new File("numbers.txt"));

    //This is for finding out the size of the array.
    int nums = 0;
    while(in.hasNextDouble() == true){
        nums++;
        in.nextDouble();            
    }

    double[] list = new double[nums];

    try{
        for (int i = 0; i < list.length; i++){
            list[i] = in.nextDouble();
        }
    }catch(NoSuchElementException e){
        System.out.print(e.getMessage());
    }

此代码整体只打印“num”量的0.0,而不是自己添加实际数字。请帮忙,谢谢。

6 个答案:

答案 0 :(得分:1)

问题是,在将数据添加到数组之前,您正在读取所有数据,因此当您添加时,没有数据可供阅读。

几种不同的选择:

Scanner in = new Scanner(new File("numbers.txt"));
int nums = 0;
double[] list = new double[5];
while(in.hasNextDouble()){
    list[nums] = in.nextDouble();
    nums++;            
}

尝试更多类似于上面的内容(对于固定数量的数据),在将它们添加到数组之前,您正在阅读所有双打..您无法读取所有数据,因为您正在查看如何您的阵列需要很大...无需您制作新的扫描仪来重新读取文件

注意:上面的代码假设你的文件总是只有5个双打,但事实并非如此,你可能想要使用一个arraylist,所以当你添加一个未知数量的双打时,列表可以扩展(参见下面的例子,使用arraylist )

Scanner in = new Scanner(new File("numbers.txt"));
ArrayList<Double> arrayList = new ArrayList<Double>();
while(in.hasNextDouble()){
    arrayList.add(in.nextDouble());            
}

或...在第一个while循环完成后,只需再次添加下面的行,原始代码就可以了。

in.close();
in = new Scanner(new File("numbers.txt"));

答案 1 :(得分:0)

使用in.nextDouble()时,您正在遍历文件

假设您的文件包含:1.0 2.0 3.0 4.0

当您使用in.hasNextDouble()时,如果存在任何值double,则此函数返回true 在我们的情况下:  1.0然后是,它返回true并抛出循环

in.nextDouble();检索1.0 double并将光标放到下一个

然后循环再次使用hasNextDouble()方法检查是否仍有Double值

直到文件中没有剩下下一个double值,应用程序退出循环

我建议你试试这段代码

        double[] list = new double[nums];
        int nums=0;

        while(in.hasNextDouble() == true){

       list[nums]= in.nextDouble();            
        nums++;

    } 

你所拥有的for循环是没用的

答案 2 :(得分:0)

您已经“扫描”了这些数字,当您的while循环终止时,内部文件位置指示符已到达文件的末尾。您需要关闭此扫描仪并重新打开它,或打开一个新扫描仪,以便它可以再次从文件顶部开始。

答案 3 :(得分:0)

您添加所有双打时,您的扫描仪已经读完了该文件。你可以重新编写代码来动态添加它们,或者只是在你的try块之前做一个不太简洁的重新初始化扫描程序的解决方案。

in = new Scanner(new File("numbers.txt"));

答案 4 :(得分:0)

这是怎么回事。

在第一个循环中,您将浏览文件中的所有数字

int nums = 0;
while(in.hasNextDouble() == true){
    nums++;
    in.nextDouble();            
}

然后你试图阅读更多不存在的双打(我假设为什么这是你试图try/catch它的原因,因为你得到了NoSuchElementExcetion。而不是试图破解那个问题,你应该一直在寻找原因。

循环浏览整个文件后,将无法再读取任何元素。因此,您必须关闭扫描仪并打开一个新扫描仪。

Scanner in = new Scanner(new File("numbers.txt"));

//This is for finding out the size of the array.
int nums = 0;
while(in.hasNextDouble() == true){
    nums++;
    in.nextDouble();            
}
in.close();

double[] list = new double[nums];

in = new Scanner(new File("numbers.txt"));   // new scanner
try{
    for (int i = 0; i < list.length; i++){
        list[i] = in.nextDouble();
    }
}catch(NoSuchElementException e){
    System.out.print(e.getMessage());
}

答案 5 :(得分:0)

while(in.hasNextDouble() == true){
    nums++;
    in.nextDouble();            
}

该循环已经扫描了文件中的数字。

要解决这个问题,你可以弄清楚如何在上面的while循环中输入数字,或者创建一个新的Scanner:

in = new Scanner(new File("numbers.txt")); // redefine Scanner "in"