我有一些 POJO
的 ArrayList
。假设员工。
然后我得到另一个 ArrayList
,它只包含那个 POJO
的“id”。(即 Employee)
现在,我想要一个来 self 的主列表的匹配 ID 的子列表。
我可以通过迭代主列表并将其与另一个列表的每个 ID 进行比较来实现。
但是,我想找出其他最佳解决方案。
如有任何指点,我们将不胜感激。
最佳答案
编辑:
- 对 Employee 的 ArrayList(或副本)进行排序。运行时间为
O(n*log n)
- 找到特定 id 的第一个和最后一个索引。这需要
O(n)
运行时间 - 使用开始和结束索引提取子列表。这也需要
O(n)
整体运行时间:O(n*log n)
整个过程如下:
初始化员工 ArrayList:
ArrayList<Employee> empArray = new ArrayList<Employee>();
创建一些随机的 Employees 进行测试:
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);
根据员工 ID 对员工 ArrayList 进行排序。
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<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)
运行时间。
关于java - 从 ArrayList 中获取匹配的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7831493/