您好,我正在读取一个文本文件并将每一行(用逗号分隔)保存到一个数组中。唯一的问题是数组中的大多数元素都是 double 值,其中两个元素是字符串。因此,我不得不将数组设为 String[] 数组。因此,每当我想对数组中的 double 值执行一些方程式时,我必须首先将它们解析为 double 值。我确实在运行这些方程式的 1000 多次迭代,因此我的代码不断地将字符串解析为 double 。这是一种代价高昂的方式,它会减慢我的程序。有没有更好的方法可以将字符串数组中的值转换为 double 值,或者在保存文本文件中的行时应该采用更好的方法?谢谢
这是我从文本文件中读取后其中一个数组的样子:
String[] details = {"24.9", "100.0", "19.2" , "82.0", "Harry", "Smith", "45.0"};
我现在需要将前 2 个元素相乘,然后将其与第 3、4 和 7 个元素的总和相加。换句话说,我只使用数字元素(当然保存为字符串)
double score = (Double.parseDouble(details[0]) * Double.parseDouble(details[1])) + Double.parseDouble(details[2]) + Double.parseDouble(details[3]) + Double.parseDouble(details[6]);
我必须对文本文件中的每一行(1000 多行)执行此操作。因此,我的程序运行非常缓慢。有没有更好的方法可以将字符串值转换为 double 值?还是有更好的方法来存储它们?
编辑:我已经使用探查器检查代码的哪一部分最慢,它确实是我上面显示的代码
最佳答案
这是一个生成输入文件的示例,就像您描述的那样,它有 10000 行长,然后读回它并进行您发布的计算并将结果打印到标准输出。为了获得最差的读取性能,我在读取文件时特别禁用了任何缓冲。正如其他人所建议的那样,我也根本没有做任何缓存。整个过程,包括生成文件、进行计算和打印结果,始终需要大约 520-550 毫秒。这算不上“慢”,除非您对数百或数千个文件重复相同的过程。如果您看到与此截然不同的性能,则可能是硬件问题。发生故障的硬盘会使读取性能几乎下降到零。
import java.io.*;
import java.util.Random;
public class ReadingDoublesFromFileEfficiency {
private static Random random = new Random();
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
String filePath = createInputFile();
BufferedReader reader = new BufferedReader(new FileReader(filePath), 1);
String line;
while ((line = reader.readLine()) != null) {
String[] details = line.split(",");
double score = (Double.parseDouble(details[0]) * Double.parseDouble(details[1])) + Double.parseDouble(details[2]) + Double.parseDouble(details[3]) + Double.parseDouble(details[6]);
System.out.println(score);
}
reader.close();
long elapsed = System.currentTimeMillis() - start;
System.out.println("Took " + elapsed + " ms");
}
private static String createInputFile() throws IOException {
File file = File.createTempFile("testbed", null);
PrintWriter writer = new PrintWriter(new FileWriter(file));
for (int i = 0; i < 10000; i++) {
writer.println(randomLine());
}
writer.close();
return file.getAbsolutePath();
}
private static String randomLine() {
return String.format("%f,%f,%f,%f,%s,%s,%f",
score(), score(), score(), score(), name(), name(), score());
}
private static String name() {
String name = "";
for (int i = 0; i < 10; i++) {
name += (char) (random.nextInt(26) + 97);
}
return name;
}
private static double score() {
return random.nextDouble() * 100;
}
}
关于Java - 将字符串转换为 double 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15176800/