2012-01-12 95 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