繁体   English   中英

从ArrayList获取匹配子集

[英]Fetch Matching Subset from ArrayList

我有一些POJOArrayList 假设员工。

然后我得到另一个仅包含该POJO “ id”的ArrayList (即Employee)。

现在,我要从主列表中找到匹配ID的子列表。

我可以通过迭代主列表并将其与另一个列表的每个ID进行比较的一种方式。

但是,我想找出其他最佳解决方案。

任何指针将不胜感激。

编辑:

  • 对Employee(或副本)的ArrayList进行排序。 运行时间为O(n*log n)
  • 查找特定ID的第一个和最后一个索引。 这需要O(n)运行时间
  • 使用开始和结束索引提取子列表。 这也需要O(n)

总运行时间:O(n * log n)

这是整个过程:

初始化Employee ArrayList:

ArrayList<Employee> empArray = new ArrayList<Employee>();

创建一些随机的员工来测试:

Employee empTemp = new Employee();
empTemp.setId("1");
empTemp.setName("emp1");
empArray.add(empTemp);

empTemp = new Employee();
empTemp.setId("2");
empTemp.setName("emp2");
empArray.add(empTemp);

empTemp = new Employee();
empTemp.setId("1");
empTemp.setName("emp3");
empArray.add(empTemp);

empTemp = new Employee();
empTemp.setId("4");
empTemp.setName("emp4");
empArray.add(empTemp);

empTemp = new Employee();
empTemp.setId("2");
empTemp.setName("emp5");
empArray.add(empTemp);

对员工ArrayList的ID进行排序。

Collections.sort(empArray, new Comparator<Object>() {

    public int compare(Object obj0, Object obj1) {
        // TODO Auto-generated method stub
        Employee one = (Employee) obj0; 
        Employee two = (Employee) obj1;
        return one.getId().compareTo(two.getId());
    }
});

初始化一个仅包含雇员ID的字符串临时ArrayList:

ArrayList<String> idOnly = new ArrayList<String>();
idOnly.add("1");
idOnly.add("3");

在这里,我们创建一个新的Employee对象,并为其分配ID,以为其创建一个子列表:

empTemp = new Employee();
empTemp.setId(idOnly.get(1));

查找该ID的开始和结束索引:

int start = empArray.indexOf(empTemp);
int end = empArray.lastIndexOf(empTemp);

从开始和结束索引创建一个子列表:

List<Employee> temp = null;
if (start != -1 && end != -1){
    temp = empArray.subList(start, end+1);
}

唯一的调整是Override Employee类中的equals(Object obj)

@Override
public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    Employee two = (Employee) obj; 
    return this.id.equals(two.getId());
}

我知道它有些棘手,但它需要n*log(n)运行时间。

将ID放入一组。 然后,您可以遍历“雇员”列表并测试它是否在您要查找的集合中,而运行时间却不差O(n^2)

如果您想编写更漂亮的代码,则还可以查看Maps.uniqueIndex来构建自己的Map,然后可以将其提取出来。

无论如何,我必须遍历集合。 最佳解决方案是使用一些可以为您完成此操作的库。 番石榴有谓词 ,在这种情况下真的很有帮助。 检查示例:

//First we build a map that stores Id => Pojo pairs
Map<Integer, POJO> map = Maps.uniqueIndex(yourPojoList, new Function<POJO, Integer>() {
  public Integer apply(POJO pojo) {
    return pojo.getId();
}});
//Now we just intersect both set and your id's list
matchingIds = map.keySet().retainAll(new HashSet(youIdCollection)); //matchingIds is what you need

id字段是哪种类型? 一种方法可能是,将POJO插入数组的特定点处的第一个ArrayList中,该点等于雇员的ID(例如,仅当它是整数时才有效)。

当然,这意味着您可以修改第一个ArrayList的插入。 否则,遍历数组是解决该问题的唯一方法。

暂无
暂无

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

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