2016-03-29 22 views
0

我有一組日常數據,我使用mongo-java驅動程序從mongo數據庫中檢索。我所查詢的表格僅有今天的日常數據。一旦得到了結果集,我就可以在一天中(00:00 - 02:00,02:00 - 04:00等)每兩小時處理一次文檔中的一個字段(雙精度值)的平均值。在2小時的時間間隔內計算平均值的最有效方法

這是我目前使用的代碼。將日期數據映射到DailyData模型(使用JsonTransformer)後,每日數據列表將通過方法的參數發送。

我已經下調了代碼,使其更容易閱讀:

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塊?

+3

嗯...你可以使用任何其他變量'雙[] occurenceOfDateRanges'和'雙[] percentages'(和數組,你以這種方式使用)和一個簡單的循環。 – Seelenvirtuose

+0

你可以用毫秒來解析時間,用'2 * 60 * 60 * 1000'除以區間數。 –

回答

1

我想我可能會做這樣的:

public List<Model> getDailyData(List<DailyData> data) throws ParseException { 

    List<Model> modelList = new ArrayList<Model>(); 

    String pattern = "yyyy-MM-ddHH:mm:ss"; 

    double[] occurenceOfDateRange = {0.0, 0.0, 0.0, 
     0.0, 0.0, 0.0, 
     0.0, 0.0, 0.0, 
     0.0, 0.0, 0.0}; 
    double[] percentages = {0.0, 0.0, 0.0, 
     0.0, 0.0, 0.0, 
     0.0, 0.0, 0.0, 
     0.0, 0.0, 0.0}; 

    if (data != null) { 
     SimpleDateFormat df = new SimpleDateFormat(pattern); 
     for (int num = 0; num < data.size(); num++) { 
      Calendar recordDate = Calendar.getInstance(); 
      recordDate.setTime(
        new SimpleDateFormat(pattern).parse(data.get(num).getCheckDate())); 

      percentages[recordDate.get(Calendar.HOUR_OF_DAY)/2] += data.get(num).getPercentage(); 
      occurenceOfDateRange[recordDate.get(Calendar.HOUR_OF_DAY)/2] += 1; 

     } 

     Calendar base = Calendar.getInstance(); 
     base.set(Calendar.HOUR, 0); 

     for (int i = 0; i < 12; i++) { 
      Model model = new Model(); 
      model.setDate_time_stamp(df.format(base)); 
      if (occurenceOfDateRange[i] != 0) { 
       model.setAvgPerc(percentages[i]/occurenceOfDateRange[i]); 
      } else { 
       model.setAvgPerc(0); 
      } 
      modelList.add(model); 
      base.set(Calendar.HOUR, base.get(Calendar.HOUR) + 2); 
     } 
    } 

    return modelList; 
} 
+0

您可以將'data.get(num)'提取到本地變量 –

+0

謝謝。奇蹟般有效。 –