java—将带有双精度的.txt文件转换为arraylist

xoshrz7s  于 2021-07-06  发布在  Java
关注(0)|答案(4)|浏览(301)

我有一个 .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);
}
7kjnsjlb

7kjnsjlb1#

由于文件中的数字用分号分隔,因此无法使用 scan.hasNextDouble() 默认情况下。然而,有很多方法可以做到这一点。
重写默认分隔符。
将一行作为字符串读取,并在分号上拆分后处理其中的每个数字。
选项1:

scan.useDelimiter(";")

请注意,由于您的文件使用逗号而不是点作为十进制符号,因此可以使用 Locale 其中它是默认值。

scan.useLocale(Locale.FRANCE);

此外,代码中的以下代码块将导致循环在读取第一个数字本身作为文件中不等于零的第一个数字后终止。只需删除这些行即可获得所需的结果:

if (nextInput != 0) {
    break;  
}

选项2:
读一行,在分号上拆分,用点替换逗号,将结果数组中的每个元素解析为 Double 并将其储存在 aList .
演示:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        File myFile = new File("file.txt");
        Scanner scan = new Scanner(myFile);

        List<Double> aList = new ArrayList<>();
        while (scan.hasNextLine()) {
            String nextInput = scan.nextLine();
            String[] arr = nextInput.split(";");
            for (String s : arr) {
                aList.add(Double.valueOf(s.replace(",", ".")));
            }
        }
        System.out.println(aList);
    }
}

输出:

[17.23, 12.1, 20.34, 88.23523]

用点代替逗号的另一种方法是 NumberFormat 如下图所示:

import java.io.File;
import java.io.FileNotFoundException;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws FileNotFoundException, ParseException {
        File myFile = new File("file.txt");
        Scanner scan = new Scanner(myFile);
        NumberFormat format = NumberFormat.getInstance(Locale.FRANCE);
        List<Double> aList = new ArrayList<>();
        while (scan.hasNextLine()) {
            String nextInput = scan.nextLine();
            String[] arr = nextInput.split(";");
            for (String s : arr) {
                aList.add(format.parse(s).doubleValue());
            }
        }
        System.out.println(aList);
    }
}
qnakjoqk

qnakjoqk2#

Scanner 通过将输入拆分为标记来工作,其中标记由空格分隔(默认情况下)。因为文本中没有空格,所以第一个/唯一的标记是整个文本,并且因为该文本不是有效的 double 价值观, hasNextDouble() 退货 false .
有两种方法可以解决这个问题:
将令牌分隔符更改为 ; :

scan.useDelimiter(";");

读取文件 BufferedReader 使用 split() :

String filename = "text.txt";
try (BufferedReader in = Files.newBufferedReader(Paths.get(filename))) {
    for (String line; (line = in.readLine()) != null; ) {
        String[] tokens = line.split(";");
        // code here
    }
}

现在将产生以下令牌: 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() 如果您的默认语言环境是瑞典。

String filename = "text.txt";
try (BufferedReader in = Files.newBufferedReader(Paths.get(filename))) {
    NumberFormat format = NumberFormat.getInstance(Locale.forLanguageTag("sv-SE"));

    for (String line; (line = in.readLine()) != null; ) {
        List<Double> aList = new ArrayList<>();

        for (String token : line.split(";")) {
            double value = format.parse(token).doubleValue();
            aList.add(value);
        }

        System.out.println(aList); // Prints: [17.23, 12.1, 20.34, 88.23523]
    }
}
oxosxuxt

oxosxuxt3#

您应该配置扫描仪,使其能够接受: ; 作为分隔符 , 作为小数分隔符
工作代码为:

File myFile = new File("input.txt");

// Swedish locale uses ',' as a decimal separator
Scanner scan = new Scanner(myFile).useDelimiter(";").useLocale(Locale.forLanguageTag("sv-SE"));

ArrayList<Double> aList = new ArrayList<>();

while (scan.hasNextDouble()) {
    double nextInput = scan.nextDouble();
    aList.add(nextInput);
}

System.out.println(aList);

有输出 [17.23, 12.1, 20.34, 88.23523]

f0ofjuux

f0ofjuux4#

只需更改分隔符即可完成。这可以通过读取字符串来实现,但也可以通过文件来实现。将这些值放入某些数据结构中由您决定。这假定您的默认语言环境使用','作为小数点。

String str = "17,23;12,1;20,34;88,23523;";

Scanner scan = new Scanner(str);
scan.useDelimiter("[;]+");
while(scan.hasNextDouble()) {
    System.out.println(scan.nextDouble());
}

印刷品

17.23
12.1
20.34
88.23523

相关问题