我遇到了一个难题。我正在寻找有关如何解决此问题的建议。我的数据集中有三个字段。我想进行减法。问题就是这样。
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可用。
答案 0 :(得分:1)
这取决于输入文件的大小:
如果数据集适合内存,则将其作为2个单独的数组或Row
个对象的一个数组(以a
和x
为字段进行加载)。之后,只需简单的迭代,便可以记住缺少a
时使用a
的最后一行是什么。
如果数据集很大,最好使用BufferedReader
进行读取,并且只记住最后遇到的a
和x
。这将大大减少内存消耗,将是首选方法。
答案 1 :(得分:0)
如果a
每隔4个数字更改一次,则可以使用time's / 4 + 1
从a
的小型数组中获取价值。
如果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;
}