2012-01-12 94 views
1

我陷入了一個問題,並沒有把邏輯放在這裏,希望你們能幫助我。有人在stackoverflow上提出了同樣的問題,我無法找到鏈接,它非常類似於發佈的查詢算法邏輯

我生成了一份報告,其中用戶選擇日期/日期並在此基礎上 值正在從數據庫中獲取並顯示在報告中。 Apache poi正在用於生成excel報告。

我有4個字段/列

ID  Date  true/false someaction 

如果用戶僅選擇一個或一個以上的日期,該方案需要所有的日期,並把它們存儲在一個ArrayList中,然後遍歷它來獲取存儲在數據數據庫中的選擇的日期

String checkLastCell = null; 

    for (Date listOfdates : datesL){ 

      //query gets fired to the database by sending listOfdates as a parameter 

      for (T tt : t) { 

       i = tt.getId(); //ID 
       j = tt.getDate(); //Date 
       k = tt.getTrueFalse(); // truefalse 


      and setting them on cells 

      for column l , i am writing some action based on the 
      l= Yes or No //someaction Yes or No 
  • 爲ID = 1,如果真在truefalse列設置,我需要在Someaction列

  • 寫是在下一次迭代中,如果ID = 2,假以truefalse列集,我會寫如果在下一次迭代中,Id = 1且False在truefalse列中設置,則需要檢查ID = 1的前一個操作,然後編寫操作 - > No(因爲其更改從真到假)

如果(lastc ell爲空& & t.getTrueFalse()。equals(「true」)|| lastcell是 不爲空& & t.getTrueFalse()。等於( 「真」)) 如果要是(lastcell是空& & t.getTrueFalse()。等於( 「假」)|| lastcell不爲空& & t.getTrueFalse()。equals(「false」)){將 操作設置爲NO} .....需要在此處寫入更多邏輯。

 i++; // increment the row  } 
      } } 

我需要以書面的僞代碼/算法中

+2

你可以給一些示例輸入和所需的輸出? – Thomas 2012-01-12 13:08:35

+1

你的例子非常混亂。如果你告訴使用someaction列的實際含義,這將有所幫助。另外,你遇到哪個問題?它是設計算法還是實現它? – 2012-01-12 13:11:01

+4

我建議你使用一些更有意義的名字,例如'truefalse'表示一個布爾標誌,但它的_meaning_是什麼?試着爲變量找到一些合理的名稱,以便更容易閱讀和理解你的代碼(在你的情況下,像'i','j'和'k'這樣的變量名也是通用的)。 - 另外,將yes或no設置爲'someAction'的值表示它也是一個布爾字段。那是對的嗎? – Thomas 2012-01-12 13:11:31

回答

0

你只需要一個HashMap(JAVA)容納包括ID的最後一行的索引建議/幫助。這是算法/實現。

List<Row> dbResults = getDatabaseResults(listOfDates); 
HashMap<int, int> idToLastIndex = new HashMap<int, int>(); 
for(int x=0; x<dbResults.size(); x++) { 
    // values 
    i = dbResults[x].getID(); 
    j = dbResults[x].getDate(); 
    k = dbResults[x].getTrueFalse(); 
    // get action value 
    if(idToIndex.containsKey(i) && k == dbResults.get(idToLastIndex.get(i)).getTrueFalse()) { 
     // if there's an old value and it equals the new one 
     a = "NO ACTION TAKEN"; 
    } else if(k == true) { 
     a = "YES"; 
    } else { 
     a = "NO"; 
    } 
    idToLastIndex.put(i, x); // ID->Index 
} 

上面的代碼被寫在web瀏覽器和沒有測試,語法錯誤可以存在。

+0

感謝您的算法,我有一個小小的懷疑,這將保持一個日期的結果是正確的嗎?如果用戶選擇多個日期,這個循環將在單日期工作,在下一個日期,我想再次檢查條件與以前的日期。我不知道,但會矢量工作? – Gaurav 2012-01-12 18:16:29

+0

@Gaurav - 如果我正確理解你,你只需要將HashMap 行移到日期循環的上方。這種方式idToLastIndex將在您的所有日期的範圍內。 – 2012-01-12 18:25:25