简体   繁体   English

迭代对象列表并比较属性

[英]Iterate a list of objects and compare properties

I am trying to Iterate a list containing Helper class objects and compare the properties of the Helper . 我正在尝试迭代包含Helper类对象的列表,并比较Helper的属性。 Based on the comparison if any validation fails,I wanted to show some error message to user. 基于比较,如果任何验证失败,我想向用户显示一些错误消息。 Below is my code snippet. 以下是我的代码段。

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;
        }

How can I compare the endDate of 1st object with the startDate of 2nd object and so on(if the Employee Name is same.In above helper list 1st & 3rd object has same name as 'MANU' ). 我如何比较第一个对象的endDate和第二个对象的startDate等等(如果Employee Name相同。在上面的助手列表中,第一个和第三个对象的名称与'MANU'相同)。 Can anyone help me on this. 谁可以帮我这个事。 Thanks in Advance !! 提前致谢 !!

I don't want to compare the Object or remove the duplicate object from the list . 我不想比较对象或从列表中删除重复的对象

I think you just need to keep a hash of last seen endDate for each name. 我认为您只需要为每个名称保留最后一次查看的endDate的哈希即可。 Eg declare this before your loop: 例如在循环之前声明:

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

Then after you've tested everything else about the current record, something like this: 然后,在测试了有关当前记录的所有其他内容之后,将如下所示:

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

You can modify your for loop like this : 您可以这样修改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 );
            }
        }
    }

Note: I wouldn't advise maintaining another data structure since you are using these dates only once and that too for comparison. 注意:我不建议您维护其他数据结构,因为您仅将这些日期使用一次,并且也将其用于比较。 The above loop will offer maximum performance both in terms of processing time and memory usage. 上面的循环将在处理时间和内存使用方面提供最佳性能。

Found the way to compare property of list of objects. 找到了比较对象列表属性的方法。 List helpers = new HelperTest().getHelpers(); 列出助手= 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.");
                }

            }

        }

    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM