這兩天的收穫

這兩天沒有做用wicket完成某地方的地理信息數據的時序分析與拓撲分析,而是幫一個同學編了幾個關於數據表處理的程序,還是蠻有收穫的。

下面是問題描述:

1、有4個站點的降雨量,50年左右每天的數據都有,保存在excel裏面,日期是按yymmdd的方式給出的(如:540323表示54年3月23日),另外就是降雨量值prcp(mm),要求求出每年每一個月的平均雨量、和每一個季度的雨量彙總,冬季爲12-2月,春季爲3-5月、夏季爲6-8月,秋季爲9-11月。

2、同樣是該4個站點,另外根據某模型,得出了模擬100年左右的降雨量,分三種模擬方式進行,分別是F、L、Y格式模擬數據,而這三種格式模擬的降雨量也存在excel中,分爲4列:用“year”,“mo”,“da”,“prcp”分別表示年、月、日、降雨量。要求對這三種格式的數據進行季度雨量彙總。

一開始,我覺得挺簡單的,但是做起來還是費了不少功夫呀?對於第一種日期,想辦法進行拆分,這是我最先、也是最直接的想法。當然對於這種yymmdd格式的日期拆分,應該有多種方法,而且也比較簡單,我想的也是最普通的辦法:把它們當作整形從數據庫取出來採用ResultSet.getInt("index")的辦法,然後再當作10級的整數進行除10的n次方取整的辦法,把它們分別剝出來(貌似這是計算機二、三級最常見的考題呀^_^):

 static int years = 0;
 static int months = 0;
 static int days = 0;

public static void getdate(int date)
{

  int[] year = new int[2];
  int[] month = new int[2];
 
  year[0] = date/100000;   //年份最高位
  year[1] = (date-year[0]*100000)/10000; //年份最低位
  month[0] = (date-year[0]*100000-year[1]*10000)/1000;  //月份最高位
  month[1] = (date-year[0]*100000-year[1]*10000-month[0]*1000)/100; //月份最低位

  days = date-year[0]*100000-year[1]*10000-month[0]*1000-month[1]*100;
  years = year[0]*10 + year[1];
  months = month[0]*10 + month[1];

 }

每一個月結束,是按照switch(getmonth)——case month:的方式進行判斷的,季度也一樣,只是把12-2、3-5、6-8、9-11再融合在一起,於是就成了switch(getseason)——case season:的方式進行判斷。這些都沒有問題。

最大的問題來自2月的結束判斷,其它月是確定的,我只要獲取得月份第一個表處理後的“months”和第二個表中的“mo”,就知道這個月有多少天,就好在case裏面設置匯數據累加彙總退出條件。但是對於2月判斷,真是傷透了腦筋,我知道很多人都會擡出經典的判斷閏年的程序來說,但是在這裏情況有點不一樣,因爲每天、每個月、每年的數據都是實實在存在的,年份在第二張表中,是抽象年份,只知道從1-100年,並不是實際的歷法年份。這樣看來,年份是混亂的,但是月份和天數沒有混亂,反正都是一天一天,一月一月來排的,2月有28天的,也有29天的。。。

因此我想的是通過直接判斷2月的數來作爲結束2月的條件,不要用年份,但是怎麼直接判斷呢?

 

我一開始還蠻高興的寫了這句話當作判斷(還有點洋洋得意):

if(rs.isLast || (days == 29 || days == 28) && (month == 2))

.......................................................................................

//如果那個月天days == 29,肯定不用判斷days == 28那個條件了,再且月爲2,肯定2月結束了,彙總輸出。但是萬萬沒有想到如果那個月是有29天,但是當days == 28的時候呢,條件也成立了,這裏如果也彙總輸出,那麼閏年的28號與29號都會輸出彙總結果。。。這就導致了後面彙總插入數據庫的時候就出現了兩個winter的現象。。。

後面,實在沒有相去別的辦法,就採用了兩種遍歷的方式,第一個遍歷是找出其中的閏年,也不用閏年算法,只看2月就沒有29,如果兩個條件滿足,那這個年份肯定是閏年,至少像閏年一樣對待。。。然後將這個年份插入數據庫,以便第二個遍歷中判斷閏年;第二個遍歷是完全遍歷,當春季末在:從數據庫中查出是閏年 && getdays == 29 && getmonths == 2,顯然,這定是閏年的冬季結束那天,彙總返回。

否則當從數據庫中查出不是閏年 && getdays == 28 && getmonths == 2,那麼也顯然這必定是非閏年的冬季最後一天,彙總返回:

      if((rest.isLast())||((!thisyearIsLeap)&&(dd == 28)&&(mm == 2)))
      {
       System.out.println("本年是普通年,當表結束或者這天巧好是2月28號,說明這一年冬季完鳥^_^");
       System.out.println(yy+"年冬季的總降雨量爲:"+sumrainfall);
       sqlinsert(yy, seas, sumrainfall);
       sumrainfall = 0.0;
      }
      else if((rest.isLast())||(thisyearIsLeap&&(dd == 29)&&(mm == 2)))

      {
       System.out.println("本年是閏年,當表結束或者這天恰好是2月29號,說明這一年冬季完鳥^_^");
       System.out.println(yy+"年冬季的總降雨量爲:"+sumrainfall);
       sqlinsert(yy, seas, sumrainfall);
       sumrainfall = 0.0;
      }

基於這種思想基本搞對了程序,不過4個站點,每份excel的數據量大概有3萬多條記錄,我又難得新建數據表,所以,所以就不停的導入、運行、導出如果反覆,而且最後面的和年還是有個Bug,就是如果最後一年有12月,還是會出現兩個Winter的數據插入數據庫,但是其它年份絕對沒有,只有4個季節,我查看了一下,就在上段代碼中,應該判斷結束有兩個條件,一個是表是否是最後了,一個是2月底,想了想,正是因爲這兩個條件之一就可結束,而進行冬季彙總,所以,最後一年在2月底會彙總一次,在表最後還會彙總一次,所以...,所以2個Winter跑出來了!!

 

現在不想弄這個Bug了,以後有空再想想吧!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章