【问题标题】:Iterate a list of objects and compare properties迭代对象列表并比较属性
【发布时间】:2015-05-29 18:34:13
【问题描述】:

我正在尝试迭代包含 Helper 类对象的列表并比较 Helper 的属性。如果任何验证失败,基于比较,我想向用户显示一些错误消息。下面是我的代码 sn-p。

public static void main(String[] args) {
    Map<String, String> errorMap = new HashMap<String, String>();
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    List<HelperDTO> helpers = new HelperTest().getHelpers();

    for (HelperDTO helperDTO : helpers) {
        String helperPkey = helperDTO.getHelperPkey();
        String employeePkey = helperDTO.getEmployeePkey();
        String helperStart = helperDTO.getHelperStart();
        String helperEnd = helperDTO.getHelperEnd();
        if (helperStart == null || "".equals(helperStart)) {
            errorMap.put("helperSt_" + helperPkey,
                    "Helper Start is required");
        }
        if (helperEnd == null || "".equals(helperEnd)) {
            errorMap.put("helperEnd_" + helperPkey,
                    "Helper End is required");
        }
        if (employeePkey == null || "".equals(employeePkey)) {
            errorMap.put("employee_" + helperPkey,
                    "Helper name is required");
        }

        try {
            if (helperStart != null && !"".equals(helperStart)
                    && helperEnd != null && !"".equals(helperEnd)) {

                Date helperStartDate = format.parse(helperStart);
                Date helperEndDate = format.parse(helperEnd);

                if (!helperEndDate.after(helperStartDate)) {
                    errorMap.put("helperEnd_" + helperPkey,
                            "Helper End should be after Helper Start.");
                }
            }

        } catch (ParseException e) {
            e.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

private List<HelperDTO> getHelpers() {
    List<HelperDTO> hdtoLst = new ArrayList<HelperDTO>();
    hdtoLst.add(new HelperDTO("100", "MANU", "07/06/2013", "08/06/2013"));
    hdtoLst.add(new HelperDTO("101", "DEEPAK", "07/06/2013", "08/06/2013"));
    hdtoLst.add(new HelperDTO("102", "MANU", "07/06/2013", "10/06/2013"));
    return hdtoLst;
        }

如何比较第一个对象的结束日期和第二个对象的开始日期等等(如果员工姓名相同。在上面的帮助列表中,第一个和第三个对象与 'MANU' 具有相同的名称>)。谁可以帮我这个事。提前致谢!!

我不想比较对象或从列表中删除重复的对象

【问题讨论】:

  • 对比什么?
  • @EduardoDennis :想比较第一个对象的 endDate 和第二个对象的 startDate 等等。 (如果员工姓名是唯一的或相同的)
  • @ManuPrakash 所以将列表中的对象与同一列表中的所有其他对象进行比较?
  • 您需要一个嵌套的 for 循环,该循环遍历所有正在进行的助手,检查它们的名称是否匹配,然后进行日期比较

标签: java arraylist compare


【解决方案1】:

我认为您只需要为每个名称保留上次看到的 endDate 的哈希值。例如。在你的循环之前声明这个:

Map<String,Date> lastDateForName = new HashMap<String,Date>();

然后,在您测试了有关当前记录的所有其他内容之后,如下所示:

if (lastDateForName.get(EmployeePKey) != null
    && !helperStartDate.after(lastDateForName.get(EmployeePKey))) {
  errorMap.put(...);
}
lastDateForName.put(EmployeePKey, helperEndDate)

【讨论】:

    【解决方案2】:

    你可以像这样修改你的 for 循环:

        for( int i = 0; i < HelperDTO.size(); i++ )
        {
            for( int j = 1; i < HelperDTO.size(); j++ )
            {
                if( HelperDTO.size().get(i).getName.equals(HelperDTO.size().get(j).getName) )
                {
                 /* End date of the Current Object */
                 Date helperEndDate = format.parse( HelperDTO.get(i).helperEnd );
                 /* Start date of the Next Object */
                 Date helperStartDate = format.parse( HelperDTO.get(j).helperStart );
                }
            }
        }
    

    注意: 我不建议维护另一个数据结构,因为您只使用这些日期一次并且也用于比较。上述循环将在处理时间和内存使用方面提供最佳性能。

    【讨论】:

      【解决方案3】:

      找到了比较对象列表属性的方法。 列出助手 = new HelperTest().getHelpers();

          for (int i = 0; i < helpers.size(); i++) {
              String outerPkey = helpers.get(i).getHelperPkey();
              String outerEmpPkey = helpers.get(i).getEmployeePkey();
              String outerStart = helpers.get(i).getHelperStart();
              String outerEnd = helpers.get(i).getHelperEnd();
      
              if (outerStart == null || "".equals(outerStart)) {
                  errorMap.put("helperSt_" + outerPkey,
                          "Helper Start is required");
              }
              if (outerEnd == null || "".equals(outerEnd)) {
                  errorMap.put("helperEnd_" + outerPkey, "Helper End is required");
              }
              if (outerEmpPkey == null || "".equals(outerEmpPkey)) {
                  errorMap.put("employee_" + outerPkey, "Helper name is required");
              }
      
              if (compareDate(outerStart, outerEnd)) {
                  errorMap.put("helperEnd_" + outerPkey,
                          "Helper End should be after Helper Start.");
              }
      
              for (int j = 0; j < helpers.size(); j++) {
                  String innerEmpPkey = helpers.get(j).getEmployeePkey();
                  if (j > i && outerEmpPkey.equals(innerEmpPkey)) {
                      String innerStart = helpers.get(j).getHelperStart();
                      String innerEnd = helpers.get(j).getHelperEnd();
      
                      if (compareDate(outerStart, outerEnd)
                              || compareDate(innerStart, innerEnd)) {
                          continue;// outer loop should take care this
                      }
      
                      if (compareOverlap(innerStart, innerEnd, outerStart,
                              outerEnd)) {
                          errorMap.put("helperEnd_" + outerPkey,
                                  "Helper End should be after Helper Start1.");
                      }
      
                  }
      
              }
      
          }
      

      【讨论】:

      • 嘿!请问你的compareDate(outerStart, outerEnd)是什么样的?
      猜你喜欢
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2016-12-11
      相关资源
      最近更新 更多