mongo-javaドライバを使用してmongo dbから取得する日々のデータのコレクションがあります。私が照会しているテーブルには、今日のデータのみが含まれています。結果セットを取得したら、1日の2時間間隔ごと(00:00 - 02:00、02:00 - 04:00など)の文書のフィールドの1つ(ダブル値)2時間間隔で平均を計算する最も効率的な方法は何ですか
これは現在使用しているコードです。日々のデータのリストは、(JsonTransformerを使って)DailyDataモデルにマップした後、メソッドのパラメータで送信されます。私は読んで、それをより容易にするコードを下にトリミングされている
:
public List<Model> getDailyData(List<DailyData> data) throws ParseException {
//These are all the variables I use in my code, I have omitted their usage in this snippet in order to trim it down
double occurenceOfDateRange1 = 0;
double occurenceOfDateRange2 = 0;
double occurenceOfDateRange3 = 0;
double occurenceOfDateRange4 = 0;
double occurenceOfDateRange5 = 0;
double occurenceOfDateRange6 = 0;
double occurenceOfDateRange7 = 0;
double occurenceOfDateRange8 = 0;
double occurenceOfDateRange9 = 0;
double occurenceOfDateRange10 = 0;
double occurenceOfDateRange11 = 0;
double occurenceOfDateRange12 = 0;
double percentage1 = 0;
double percentage2 = 0;
double percentage3 = 0;
double percentage4 = 0;
double percentage5 = 0;
double percentage6 = 0;
double percentage7 = 0;
double percentage8 = 0;
double percentage9 = 0;
double percentage10 = 0;
double percentage11 = 0;
double percentage12 = 0;
List<Model> modelList = new ArrayList<Model>();
String pattern = "yyyy-MM-ddHH:mm:ss";
//There are 9 more date variables created like these three below (06:00:00, 08:00:00, 10:00:00 etc to 23:59:59)
String dateStr1 = getdate() + " 00:00:00"; //getDate() refers to a separate method in which I return the current date in yyyy/MM/dd string format
Date date1 = new SimpleDateFormat(pattern).parse(dateStr1);
String dateStr2 = getdate() + " 02:00:00";
Date date2 = new SimpleDateFormat(pattern).parse(dateStr2);
String dateStr3 = getdate() + " 04:00:00";
Date date3 = new SimpleDateFormat(pattern).parse(dateStr3);
//the other 9 date variables are created here
if (data != null) {
for (int num = 0; num < data.size(); num++) {
Date recordDate = new SimpleDateFormat(pattern).parse(data.get(num).getCheckDate());
//Ten more checks along with the following two are done, I have omitted them to slim the code down (checks between date3 and date4, between date4 and date 5 etc)
if (recordDate.after(date1) && recordDate.before(date2)) {
percentage1 += data.get(num).getPercentage();
occurenceOfDateRange1 += 1;
}
if (recordDate.after(date2) && recordDate.before(date3)) {
percentage2 += data.get(num).getPercentage();
occurenceOfDateRange2 += 1;
}
//checks for the rest of the dates are done here
}
Model model = new Model();
//the following if blocks are repeated 10 more times for percentage3 to percentage12
if (percentage1 != 0) {
model = new Model();
model.setDate_time_stamp(dateStr1);
if (occurenceOfDateRange1 != 0) {
model.setAvgPerc(percentage1/occurenceOfDateRange1);
} else {
model.setAvgPerc(0);
}
modelList.add(model);
}
if (percentage2 != 0) {
model = new Model();
model.setDate_time_stamp(dateStr2);
if (occurenceOfDateRange2 != 0) {
model.setAvgPerc(percentage2/occurenceOfDateRange2);
} else {
model.setAvgPerc(0);
}
modelList.add(model);
}
}
return modelList;
}
私の質問がある - は、二間の平均割合を計算する(あなたがするかどうか賢く)より効率的な方法はありますたくさんのifブロックを使わずに時間間隔を空けていますか?
私はこのようにそれを行うかもしれないと思う
うーん...あなたは 'ダブル[] occurenceOfDateRanges'とそのご、他の変数の'ダブル[] percentages'(と配列を使用することができますその方法で使用する)と単純なforループを使用します。 – Seelenvirtuose
ミリ秒単位で時間を解析し、 '2 * 60 * 60 * 1000'で除算してインターバル番号を取得できます。 –