我有一个看起来像这样的文本文件:
苹果
10.1 20 11 21.3 31 12.7 22 32.4 42 13
第一行是公司名称,第二行代表它的股票价格。
我想将所有双打扫描到一个数组中,以便我可以执行计算。
这是我的代码
public static void main(String[] args) throws FileNotFoundException {
Scanner keyboard = new Scanner(System.in);
System.out.println("Select A File");
String FileName = keyboard.next();
Scanner linReader = new Scanner(new File(FileName));
double[] values = new double[10];
while (linReader.hasNextLine()) {
linReader.nextLine(); // skips company name
String line = linReader.nextLine();
// store following doubles into array
int nums = 0; //
if (linReader.hasNextDouble()) {
values[nums] = linReader.nextDouble();
nums++;
}
}
linReader.close();
System.out.println(Arrays.toString(values)); //prints out array 'values'
}
我选择文件,然后跳过第一行(包含公司名称)。
然后我初始化一个数字以跟踪数组中的indeces。如果该行有另一个double,那么它将被添加到索引'num'的数组中,'num'将增加1,这将继续,直到没有更多的双倍。
至少这是它背后的逻辑。但输出总是出现
[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]
我不确定为什么会发生这种情况或如何解决它。
答案 0 :(得分:0)
我想linReader.nextDouble()
在之前读取的行之后正在寻找一个双。
尝试删除对nextLine()
的一次通话。如果这没有帮助,请使用此算法:
linReader.nextLine(); // skips company name
String line = linReader.nextLine();
String[] strings = line.split(" ");
for (int i = 0; i < strings.length; i++) {
try {
values[nums++] = Double.parseDouble(strings[i]);
} catch (NumberFormatException e) {
} catch (ArrayIndexOutOfBoundsException e) {
break;
}
}
答案 1 :(得分:0)
原因是你没有使用双线,然后双数组有默认值,即0.0。这一行:
String line = linReader.nextLine();
是问题的一部分。当您执行以下行时:
linReader.nextLine(); // skips company name
String line = linReader.nextLine();
您希望跳过公司行的第一行(lineReader.nextLine
),它显示为Apple
。这一切都很好,但是当你这样做时,
String line = linReader.nextLine();
这将读取双打行。然后,您的if
永远不会执行,因为文件中没有更多要读取的内容,因此双数组的值不会分配默认值以外的值。打印line
您会看到:
10.1 20 11 21.3 31 12.7 22 32.4 42 13
然后你可以这样做:
for(int i = 0; i < line.split(" ").length; i++) {
values[i] = Double.parseDouble(line.split(" ")[i]);
}
而不是if
语句。然后它将正确输出:
[10.1, 20.0, 11.0, 21.3, 31.0, 12.7, 22.0, 32.4, 42.0, 13.0]
上面的代码执行传统的C风格for循环。它遍历通过执行line.split(" ")
创建的双精度数组,它将空间中的所有值拆分为数组。这创造了:
["10.1", "20", "11, "21.3", "31", "12.7", "22", "32.4", "42", "13"]
接下来,您只需循环遍历all,使用当前迭代或索引访问values
数组,并将其分配给上面字符串数组中当前元素的解析后的double。您可以根据需要格式化并捕获任何异常。
这是while循环中的最终代码:
String companyName = linReader.nextLine(); // if you want the company name, this stores it
String line = linReader.nextLine(); // this contains all double values in a string
for(int i = 0; i < line.split(" ").length; i++) { // loops over all doubles in split string array
values[i] = Double.parseDouble(line.split(" ")[i]); // parses them as doubles and then stores to double array
}
答案 2 :(得分:0)
也许您可以像这样更改代码:
public static void main(String[] args) throws FileNotFoundException {
Scanner keyboard = new Scanner(System.in);
System.out.println("Select A File");
String FileName = keyboard.next();
Scanner linReader = new Scanner(new File(FileName));
Vector<Double> values = new Vector<>();
while (linReader.hasNextLine()) {
linReader.nextLine(); // skips company name
String line = linReader.nextLine();
String _line[] = line.split(" ");
for (String item : _line) {
if (!item.isEmpty()) {
values.add(Double.parseDouble(item));
}
}
}
linReader.close();
System.out.println(values.toString()); //prints out array 'values'
}