java - 从 ArrayList 中获取匹配的子集

标签 java iterator

我有一些 POJOArrayList。假设员工。

然后我得到另一个 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/

相关文章:

java - JTable 单元格监听器 JAVA

java - 使用 java :module scoped resources 使用 EJB 3 和 glassfish 进行 JUnit 测试

java - 在迭代期间向集合中添加元素

python - 使用生成器生成排列

c++ - 存储 std::deque 的迭代器

scala - 如何在Scala中将takeWhile与迭代器一起使用

c++ - 在循环中使用 std::list 的删除方法会创建段错误

java - 错误 org.hibernate.exception.SQLGrammarException : could not extract ResultSet

java - 如何从字符串中调用变量?

java - 与 Sql Server 2008 的 JDBC 连接