减去Java价值短缺

时间:2018-07-02 19:12:59

标签: java arrays

我遇到了一个难题。我正在寻找有关如何解决此问题的建议。我的数据集中有三个字段。我想进行减法。问题就是这样。

 Time(s)    a      x
  1         0.1    0.2
  2                0.4
  3                0.6
  4                0.7
  5         0.2    0.9

我需要从(a-x)中减去。但是减法的方法类似于在时间1s a的值为0.1。该操作将是(0.1-0.2)第一次迭代。 2nd iteration (0.1-0.4)3rd iteration (0.1-0.6)4th iteration (0.1-0.7)但是在第二次迭代中,它将是(0.2-0.9)

这是我的问题陈述。我想在Java中写下此代码。 I don't need Java code。我可以自己写下来。我需要一个建议如何进行这种方法?一种想法是creating array for each variable。但随后陷入循环。循环如何迭代?很明显,数组a是静态的,直到获得下一个值为止,该值在时间5s可用。

3 个答案:

答案 0 :(得分:1)

这取决于输入文件的大小:

  1. 如果数据集适合内存,则将其作为2个单独的数组或Row个对象的一个​​数组(以ax为字段进行加载)。之后,只需简单的迭代,便可以记住缺少a时使用a的最后一行是什么。

  2. 如果数据集很大,最好使用BufferedReader进行读取,并且只记住最后遇到的ax。这将大大减少内存消耗,将是首选方法。

答案 1 :(得分:0)

如果a每隔4个数字更改一次,则可以使用time's / 4 + 1a的小型数组中获取价值。

如果a并非每4个数字改变一次,那么我建议使用充满相同值的完整数组。

答案 2 :(得分:0)

现在我看到您不是在使用数据库,而是从文件中读取文件,也许可以尝试

只需保留旧值a,直到新值覆盖它。 这是高效的内存,因为它可以逐行解析。

public static List<Double> parseFile(String myFile) throws IOException {

    List<Double> results = new ArrayList<>();
    try (BufferedReader b = new BufferedReader(new FileReader(myFile));) {
        b.readLine(); // ** skip header?

        String line;
        Integer time = null;
        Double a = null;
        Double x = null;
        for (int lineNum = 0; (line = b.readLine()) != null; lineNum++) {

            // ** split the data on any-and-all-whitespace
            final String[] data = line.split("\\s+");
            if (data.length != 3)
                throw new RuntimeException("Invalid data format on line " + lineNum);

            try {
                time = Integer.valueOf(data[0]);
                if (!data[1].trim().isEmpty()) {
                    a = Double.valueOf(data[1]);
                }
                if (!data[2].trim().isEmpty()) {
                    x = Double.valueOf(data[2]);
                }
            } catch (Exception e) {
                throw new RuntimeException("Couldn't parse line " + lineNum, e);
            }

            if (a == null || x == null) {
                throw new RuntimeException("Values not initialized at line " + lineNum);
            }

            results.add(Double.valueOf(a.doubleValue() - x.doubleValue()));
        }
    }
    // ** finished parsing file, return results
    return results;
}