繁体   English   中英

比较两个不同类型的数组列表

[英]Compare two arraylist of different types

我有2个数组列表,分别称为Assignment和Person,它们的类型和大小也不同。 问题陈述:我想从人ID等于工作ID的人中删除项目,我用比较器写。

SortedSet<Map.Entry<AssignmentResults, Person>> text = new TreeSet<Map.Entry<AssignmentResults, Person>>(
        new Comparator<Map.Entry<AssignmentResults, Person>>() {

            @Override
            public int compare(Entry<AssignmentResults, Person> lhs,
                    Entry<AssignmentResults, Person> rhs) {
                // TODO Auto-generated method stub
                int statusvalue = 0;

                if (rhs.getValue().getId()
                        .equals(lhs.getKey().getId()))
                    statusvalue = 1;

                return statusvalue;
            }

        });

但是我不确定如何使用它来获取人员arraylist,其中所有不包含作业ID的项目都将被删除。请帮助。 我需要鲁棒性高,复杂度低的逻辑

您可以将所有分配的ID保存到HashSet ,然后使用for-loop从人员列表中删除项目:

Set<Long> assigmentsIdsSet = new HashSet<Long>(); // here we will store all assigments' ids

for (AssignmentResults assigment : assigmentsList) { // assigmentsList is your array list of assigments
    assigmentsIdsSet.add(assigment.getId());
}

// now go through list of persons and remove persons with ids from assigmentsIdsSet
for (Iterator<Person> it = personList.iterator(); it.hasNext(); ) {
    if (assigmentsIdsSet.contains(it.next().getId())) {
        it.remove();
    }
}
  1. 上面的代码无法抛出ArrayOutOfBounds异常
  2. 它在数组大小上具有线性复杂度

令人困惑:您打算处理列表,并比较地图条目。

您可以:

  • 让您的PersonAssignment类都实现与getId的公共接口。

  • 在两个类中都覆盖equals ,以便具有相同id的对象相等。 您可以使用getIdObject参数转换为公共接口的实例。

  • 您还应该覆盖hashCode以使具有相同ID的对象具有相同的哈希码。 如果id是一个对象,则可以只返回getId().getHashCode()

  • 然后,您可以执行persons.removeAll(assignments)

附带说明一下,所有这些都不是真正的“干净”。 但是它将为该特定用例完成工作。 如果您打算为图书馆提供许多其他用例,请不要依赖它

暂无
暂无

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

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