Java - 将字符串转换为 double 的最有效方法

标签 java arrays string parsing double

您好,我正在读取一个文本文件并将每一行(用逗号分隔)保存到一个数组中。唯一的问题是数组中的大多数元素都是 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/

相关文章:

java - Android中执行后台定时重复任务,以及IntentService和Runnable的区别

java - Spring Boot 的时区

c - 传递可变大小的多维数组

c - MPI 通信大型二维数组

javascript - 如何使用indexOf在数组中查找函数

c++ - 字符串数组作业

java - 哪个类用于写入字符而不是字节?

java - 无法使用 Genymotion 运行我的应用程序

c# - 字符串拆分连续重复字符

c - C中的反转字符串