我有一个 .txt
包含此内容的文件: "17.23;12.1;20.34;88.23523;"
. 我想把这个文件读成一个 ArrayList
. 最终打印出 ArrayList
(并最终打印最小值和最大值,但我不认为这将是一个问题后解决这个问题)。
但我只得到输出“[]”。
我做错什么了?我已经为这件事挣扎了15个多小时,浏览了这里,youtube,课本。。。
我的代码:
public static void main(String[] args) throws IOException {
File myFile = new File("text.txt");
Scanner scan = new Scanner(myFile);
ArrayList<Double> aList = new ArrayList<>();
while (scan.hasNextDouble()) {
double nextInput = scan.nextDouble();
if (nextInput != 0) {
break;
}
aList.add(nextInput);
}
System.out.println(alist);
}
4条答案
按热度按时间7kjnsjlb1#
由于文件中的数字用分号分隔,因此无法使用
scan.hasNextDouble()
默认情况下。然而,有很多方法可以做到这一点。重写默认分隔符。
将一行作为字符串读取,并在分号上拆分后处理其中的每个数字。
选项1:
请注意,由于您的文件使用逗号而不是点作为十进制符号,因此可以使用
Locale
其中它是默认值。此外,代码中的以下代码块将导致循环在读取第一个数字本身作为文件中不等于零的第一个数字后终止。只需删除这些行即可获得所需的结果:
选项2:
读一行,在分号上拆分,用点替换逗号,将结果数组中的每个元素解析为
Double
并将其储存在aList
.演示:
输出:
用点代替逗号的另一种方法是
NumberFormat
如下图所示:qnakjoqk2#
Scanner
通过将输入拆分为标记来工作,其中标记由空格分隔(默认情况下)。因为文本中没有空格,所以第一个/唯一的标记是整个文本,并且因为该文本不是有效的double
价值观,hasNextDouble()
退货false
.有两种方法可以解决这个问题:
将令牌分隔符更改为
;
:读取文件
BufferedReader
使用split()
:现在将产生以下令牌:
17,23
,12,1
,20,34
,88,23523
.不幸的是,这些都是无效的
double
值,因为它们使用特定于区域设置的格式,即小数点是,
,不是.
.也就是说如果你继续使用
Scanner
,您不能使用hasNextDouble()
以及nextDouble()
,如果您更改为使用split()
,您不能使用Double.parseDouble()
.你需要使用
NumberFormat
解析特定于语言环境的数字格式。既然“uppgift”看起来像瑞典语,我们可以用NumberFormat.getInstance(Locale.forLanguageTag("sv-SE"))
,或者只是NumberFormat.getInstance()
如果您的默认语言环境是瑞典。oxosxuxt3#
您应该配置扫描仪,使其能够接受:
;
作为分隔符,
作为小数分隔符工作代码为:
有输出
[17.23, 12.1, 20.34, 88.23523]
f0ofjuux4#
只需更改分隔符即可完成。这可以通过读取字符串来实现,但也可以通过文件来实现。将这些值放入某些数据结构中由您决定。这假定您的默认语言环境使用','作为小数点。
印刷品