[英]Fetch Matching Subset from ArrayList
我有一些POJO
的ArrayList
。 假设员工。
然后我得到另一个仅包含该POJO
“ id”的ArrayList
(即Employee)。
现在,我要从主列表中找到匹配ID的子列表。
我可以通过迭代主列表并将其与另一个列表的每个ID进行比较的一种方式。
但是,我想找出其他最佳解决方案。
任何指针将不胜感激。
编辑:
O(n*log n)
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.