【问题标题】:Algorithm logic算法逻辑
【发布时间】:2012-01-12 13:04:32
【问题描述】:

我陷入了一个问题,未能在这里提出逻辑,希望你们能帮助我。有人在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 列中设置 True,我需要在 Someaction 列中写 Yes

  • 在下一次迭代中,如果 id = 2 ,并且在 truefalse 列中设置了 False,我会在 someaction 列中写 No,

  • 1234563 )

if (lastcell 为 Null && t.getTrueFalse().equals("true") || lastcell 为 不为空 && t.getTrueFalse().equals("true")) if if (lastcell is Null && t.getTrueFalse().equals("false") || lastcell 不为空 && t.getTrueFalse().equals("false")) { 设置 动作为 NO } .....这里需要写一些更多的逻辑。

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

我需要建议/帮助来编写伪代码/算法

【问题讨论】:

  • 你能给出一些示例输入和所需的输出吗?
  • 您的示例非常令人困惑。如果您告诉使用 someaction 列的实际含义,将会有所帮助。另外,您遇到问题的哪一部分?是设计算法还是实现算法?
  • 我建议你使用一些更有意义的名字,例如truefalse 表示一个布尔标志,但它的含义是什么?尝试为变量找到一些合理的名称,以便更轻松地阅读和理解您的代码(在您的情况下,ijk 等变量名称也太通用了)。 - 此外,将yes 或no 设置为someAction 的值表示它也是一个布尔字段。对吗?
  • truefalse 不表示布尔值,请原谅我让它成为一个令人困惑的问题。它只是指示系统是 Up (true) 还是 Down(false)。我需要比较 ID 和此列并根据它编写操作。
  • 我的问题是单个日期记录中可能存在大量 ID,如果选择了多个日期,将如何处理性能问题。

标签: java algorithm hashmap


【解决方案1】:

您只需要一个 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
}

注意 以上代码是在网络浏览器中编写的,未经测试,可能存在语法错误。

【讨论】:

  • 感谢您的算法,我有一个小疑问,这将保持一个日期的结果对吗?如果用户选择多个日期怎么办,这个循环适用于单个日期,在下一个日期,我想再次检查前一个日期的条件。我不确定,但是矢量会起作用吗?
  • @Gaurav - 如果我对您的理解正确,您只需将 HashMap 行移到日期循环上方。这样 idToLastIndex 将在您的所有日期范围内。
猜你喜欢
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
相关资源
最近更新 更多