わかりました、私は動作するコードを持っています。しかし、ループを何度も繰り返す必要があるため、非常に長い時間がかかります (1 日あたり約 7 か月分、1 日あたり 30,000 の分散があります)。他に良い提案はありますか?
このコードは、一見単純に見えるものの、約 24 ~ 28 時間かかることを意味します...
パッケージ VarPackage;
java.io.BufferedReader をインポートします。java.io.FileReader をインポートします。import java.util.ArrayList;
パブリック クラス ReadText {
public static void main(String[] args) throws Exception {
String inputFileName="C:\\MFile";
ArrayList<String> fileLines = new ArrayList<String>();
FileReader fr;
BufferedReader br;
// Time
int t = 1;
fr = new FileReader(inputFileName);
br = new BufferedReader(fr);
String line;
while ((line=br.readLine())!=null) {
fileLines.add(line);
}
AvgVar myVar = new AvgVar(fileLines);
for(t=1; t<10; t++){
System.out.print("Average Var at Time t=" + t + " = " + myVar.avgVar(t)+"\n");
}
} }
===================================
新しいクラス
パッケージ VarPackage;
import java.util.ArrayList;
public class AvgVar { // クラス変数 private ArrayList inputData = new ArrayList();
// コンストラクタ AvgVar(ArrayList fileData){ inputData = fileData; }
public double avgVar(int time){
double avgVar = 0;
ArrayList<double[]> avgData = avgDuplicateVars(inputData);
for(double[] arrVar : avgData){
avgVar += arrVar[time-1];
//System.out.print(arrVar[time-1] + "," + arrVar[time] + "," + arrVar[time+1] + "\n");
//System.out.print(avgVar + "\n");
}
avgVar /= numDays(inputData);
return avgVar;
}
private int numDays(ArrayList<String> varData){
int n = 0;
int flag = 0;
for(文字列 : varData){
String[] myData = line.split(" ");
if(myData[0].equals("DATE") && flag == 0){
flag = 1;
}
else if(myData[0].equals("DATE") && flag == 1){
n = n + 1;
flag = 0;
}
}
n を返します。
}
private ArrayList<double[]> avgDuplicateVars(ArrayList<String> varData){
ArrayList<double[]> avgData = new ArrayList<double[]>();
double[] varValue = new double[86400];
double[] varCount = new double[86400];
int n = 0;
int flag = 0;
for(String iLine : varData){
String[] nLine = iLine.split(" ");
if(nLine[0].equals("DATE") && flag == 0){
for (int i=0; i<86400; i++){
varCount[i] = 0;
varValue[i] = 0;
}
flag = 1;
}
else if(nLine[0].equals("DATE") && flag == 1){
for (int i=0; i<86400; i++){
if (varCount[i] != 0){
varValue[i] /= varCount[i];
}
}
varValue = fillBlankSpreads(varValue, 86400);
avgData.add(varValue.clone());
flag = 0;
}
else{
n = Integer.parseInt(nLine[0])-1;
varValue[n] += Double.parseDouble(nLine[2]);
varCount[n] += 1;
}
}
avgData を返します。
}
private double[] fillBlankSpreads(double[] varValue, int numSpread){
//Filling the Data with zeros to make the code faster
for (int i=1; i<numSpread; i++){
if(varValue[i] == 0){
varValue[i] = varValue[i-1];
}
}
return varValue;
}
}