【发布时间】:2017-03-29 11:56:04
【问题描述】:
在我的程序中,我试图读取一个包含字符串、布尔值和双精度的文件。如果在填充数组时确定它不是双精度,我试图让它跳过一行。这是通过首先检查线路上是否有数据来完成的。然后它确定第一个字符是否为数字。但是,当我用 Arrays.deepToString 打印应该填充的数组时,它会显示:
[[2.33, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], ...
我想知道是否有人能告诉我为什么它没有正确填充。下面是示例代码:
public static double[][] readFile(String fileName) throws IOException
{
double data[][] = new double[30][6];
int indexRow = 0, indexCol = 0;
File file = new File(fileName);
Scanner input = new Scanner(file);
while(input.hasNext())
{
String temp = input.nextLine();
if(temp.trim().length() > 0)
{
if(Character.isDigit(temp.charAt(0)))
{
data[indexRow][indexCol] = input.nextDouble();
if(indexCol < 6) indexCol++;
if(indexRow < 30 && indexCol % 6 == 0)
{
indexRow++;
indexCol = 0;
}
}
else{}
}
else
break;
}
System.out.println(Arrays.deepToString(data));
return data;
}
这是一个文件示例(它应该只是用双打填充数组):
Washington Capitals
3.02
2.33
85.2
30.6
28.4
True
Dallas Stars
3.23
2.78
82.3
32.0
28.9
True
St. Louis Blues
2.67
2.40
85.1
30.2
29.7
True
提前致谢。
编辑 这是当前数组:
[[3.02, 2.33, 85.2, 30.6, 28.4], [3.23, 2.78, 82.3, 32.0, 28.9], [2.67, 2.4, 85.1, 30.2, 29.7], [2.94, 2.43, 84.4, 33.2, 29.7], [2.83, 2.44, 79.5, 28.8, 29.5], [2.85, 2.52, 80.3, 30.5, 30.8], [2.62, 2.29, 87.2, 30.3, 27.5], [2.72, 2.34, 81.4, 32.0, 27.5], [2.84, 2.62, 78.2, 28.5, 30.4], [2.77, 2.57, 84.5, 29.4, 30.4], [2.89, 2.52, 80.5, 30.4, 27.4], [2.73, 2.41, 84.0, 29.3, 28.9], [2.73, 2.6, 81.2, 30.6, 27.3], [2.57, 2.56, 80.5, 31.0, 30.7], [2.88, 2.78, 82.2, 32.0, 30.4], [2.55, 2.67, 81.5, 29.7, 29.7], [2.6, 2.49, 77.9, 29.0, 28.6], [2.39, 2.7, 84.3, 29.9, 27.6], [2.8, 2.94, 75.8, 28.4, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0]]
这是完整的文件:
Carolina Hurricanes
2.39
2.70
84.3
29.9
27.6
False
Ottawa Senators
2.80
2.94
75.8
28.4
32.8
False
New Jersey Devils
2.22
2.46
83.0
24.4
28.6
False
Colorado Avalanche
2.59
2.93
80.2
28.6
32.3
False
Montréal Canadiens
2.63
2.84
81.9
30.5
29.4
False
Buffalo Sabres
2.43
2.62
82.6
29.5
30.6
False
Winnipeg Jets
2.59
2.88
78.4
29.6
29.5
False
Arizona Coyotes
2.54
2.98
77.3
27.6
31.0
False
Calgary Flames
2.79
3.13
75.5
29.2
29.0
False
Columbus Blue Jackets
2.60
3.02
81.0
29.1
31.1
False
Vancouver Canucks
2.27
2.91
81.1
28.2
32.5
False
Edmonton Oilers
2.43
2.95
81.1
29.1
31.1
False
Toronto Maple Leafs
2.34
2.93
81.6
30.7
30.5
False
【问题讨论】:
-
每次迭代你已经在这里阅读了
String temp = input.nextLine();的行,然后尝试在data[indexRow][indexCol] = input.nextDouble();解析该行,但这所做的是阅读另一行......你想使用data[indexRow][indexCol] = Double.parseDouble(temp);作为它解析先前检查的行 -
@Japu_D_Cret 感谢您的意见。
-
您的问题解决了吗?如果没有,我会用另一个小问题创建一个更详细的答案并进一步阐述,也感谢您的反馈
-
@Japu_D_Cret 实际上,它只是部分填充了数组。它在最后留下了大约 30 套中的 11 套空白。最后一组也只填了一半。
-
对我来说,它与示例数据完美结合,尽管每次迭代只有 5 个双精度值,而不是数组长度建议的 6 个值