从ArrayList获取匹配子集

Har*_*hra 2 java iterator

我有ArrayList一些POJO.让我们说员工.

然后我得到另一个ArrayList只包含'id'的那个POJO.(即员工)

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

我可以通过迭代主列表并将其与另一个列表的每个id进行比较来实现此目的.

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

任何指针将不胜感激.

Has*_*imR 5

编辑:

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

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

这是整个过程:

初始化Employee ArrayList:

ArrayList<Employee> empArray = new ArrayList<Employee>();
Run Code Online (Sandbox Code Playgroud)

创建一些随机的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);
Run Code Online (Sandbox Code Playgroud)

将Employees 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());
    }
});
Run Code Online (Sandbox Code Playgroud)

初始化String的临时ArrayList,其中只包含Employees的ID:

ArrayList<String> idOnly = new ArrayList<String>();
idOnly.add("1");
idOnly.add("3");
Run Code Online (Sandbox Code Playgroud)

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

empTemp = new Employee();
empTemp.setId(idOnly.get(1));
Run Code Online (Sandbox Code Playgroud)

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

int start = empArray.indexOf(empTemp);
int end = empArray.lastIndexOf(empTemp);
Run Code Online (Sandbox Code Playgroud)

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

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

只有TWEAK是Overrideequals(Object obj)在Employee类:

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

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