Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在读取另一个文件时生成双精度数组_Java_Arrays_Class - Fatal编程技术网

Java在读取另一个文件时生成双精度数组

Java在读取另一个文件时生成双精度数组,java,arrays,class,Java,Arrays,Class,我正在尝试制作一个程序,它有一个主类读取输入文件并调用另一个类来存储文件包含的双精度。我调用的另一个类将双精度放入两个数组中,但我没有成功。任何帮助都将不胜感激。 这是主要课程: package Assignments; import java.util.Scanner; import ui.UIAuxiliaryMethods; public class Processing { Processing(){ UIAuxiliaryMethods.askUserForInput(

我正在尝试制作一个程序,它有一个主类读取输入文件并调用另一个类来存储文件包含的双精度。我调用的另一个类将双精度放入两个数组中,但我没有成功。任何帮助都将不胜感激。 这是主要课程:

package Assignments;

import java.util.Scanner;

import ui.UIAuxiliaryMethods;

public class Processing {

Processing(){
    UIAuxiliaryMethods.askUserForInput();   
}

private void start() {
    Scanner in=new Scanner(System.in);
    int numberOfClusters=in.nextInt();
    int numberOfElements=in.nextInt();
    int numberOfVariables=in.nextInt();

    String line=in.nextLine();
    String lineToIgnore=in.nextLine();
    NumberRow i=new NumberRow(numberOfElements);

    while(in.hasNext()){
        String lineToFindDouble=in.next();
        NumberRow.start(lineToFindDouble);  
    }
    System.out.println("\nend");


}

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

}
我打电话来存储双打的班级是: 成套作业

import java.util.Arrays;
import java.util.Scanner;

import ui.UIAuxiliaryMethods;

public class NumberRow {
static int i;
static double[] fatContent;
static double[] protienContent;

NumberRow(int numberOfElements){
    this.i=numberOfElements;
    fatContent=new double[i];
    protienContent=new double[i];
}

static void start(String in){

    Scanner findingDoubles=new Scanner(in);

    int counter=0;
    while(findingDoubles.hasNext()){
    double fat=findingDoubles.nextDouble();
    double protien=findingDoubles.nextDouble();
    fatContent[counter]=fat;
    protienContent[counter]=protien;
    counter++;
    }
    System.out.println(Arrays.toString(fatContent));
}
}
我使用的输入文件是:

7
25
2
Mammal  fat_content(%)  protein_content(%)
Bison   7.9 5.9
Guinea_pig  3.9 8.1
Dolphin 14.0    10.4
Donkey  1.4 1.7
Goat    4.1 3.4
Deer    19.7    9.2
Dog 8.3 9.5
Yak 6.7 5.3
Camel   3.4 3.5
Cat 10.9    11.1
Rabbit  13.1    7.1
Llama   3.2 3.9
Human   43.9    7.4
Mule    1.8 2.0
Elephant    5.0 4.0
Horse   1.3 2.1
Rat 12.6    12.3
Reindeer    20.3    10.4
Sheep   6.4 5.6
Pig 5.1 6.6
Fox 5.9 7.4
Whale   42.3    10.9
Polar_bear  31.0    10.2
Zebra   4.8 3.0
Seal    53.2    11.2
我得到的错误是:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:840)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextDouble(Scanner.java:2387)
at Assignments.NumberRow.start(NumberRow.java:25)
at Assignments.Processing.start(Processing.java:25)
at Assignments.Processing.main(Processing.java:33)
任何帮助都将不胜感激

PS:我是初学者,所以如果我的代码在你看来很愚蠢,我向你道歉


谢谢。

开始时,您应该在循环条件下使用
hasNext
方法

您需要检查每行是否有超过2个双工。比如:

static int i;
static double[] fatContent;
static double[] protienContent;
static int counter;

NumberRow(int numberOfElements){
    this.i=numberOfElements;
    fatContent=new double[i];
    protienContent=new double[i];
    counter = 0;
}

static void start(String in){

    Scanner findingDoubles=new Scanner(in);

    while(findingDoubles.hasNext()){
      String name = findingDoubles.next();
      if(!findingDoubles.hasNextDouble()) continue;
      double fat=findingDoubles.nextDouble();
      if(!findingDoubles.hasNextDouble()) continue;
      double protien=findingDoubles.nextDouble();
      fatContent[counter]=fat;
      protienContent[counter]=protien;
      counter++;
    }
    System.out.println(Arrays.toString(fatContent));

此外,正如Adam Yost的回答中所揭示的,
计数器
不应在
启动
方法中重置

我马上就能看到三个问题

你跳过了野牛队。您调用in.nextLine,那么linetoignore是另一个in.nextLine

您正在调用.nextDouble,它想要返回一个字符串。 在您的
start
方法
NumberRow
中,您需要一条线路,然后调用nextDouble。但实际上,您知道第一个条目是字符串。您可以通过在start方法的开头调用.next中的
来修复它,以丢弃字符串

最后,每次调用start时都将计数器重置为0,因此每次都会覆盖计数器。在构造函数中设置计数器,然后在开始时引用它。

Scanner.nextDouble()读取下一个值并将其解释为双精度。您正在读取字符串并试图将其转换为双精度的第一个错误

while(in.hasNext()){
    String lineToFindDouble=in.next();
    NumberRow.start(lineToFindDouble);  
}
在这个位置执行
next()
时,您将得到
Bison
。 您应该将此代码更改为

 while(in.hasNextLine()){
        String lineToFindDouble=in.nextLine();
        NumberRow.start(lineToFindDouble);  
    }
因此,您将传递到
NumberRow.start(“Bison 7.9 5.9”)

下一个

以你的名义

 while(findingDoubles.hasNext())
此时,扫描仪光标指向
Bison
。 你应该换成

while(findingDoubles.hasNextDouble())
所以扫描仪将继续查找double并在下一个double处等待


调用next()时,如果扫描仪的find space/double/int左右,则会停止扫描。有关详细信息,请查看文档。

如果您在完成以下所有答案后无法自己解决此问题。我准备帮助你,如果需要的话,我甚至会帮你一行一行地写代码:)@Roan非常感谢你这么好……我已经弄明白了,但我非常感谢你提供的帮助……谢谢:)没问题,太好了,看到你弄明白了,祝你其余的代码好运:)没问题,这就是这个网站的人的优点互相帮助并提供帮助:)