基于价值观拆分Arraylist的最佳方法是什么?

时间:2014-12-10 13:35:54

标签: java

我想拆分ArrayList我正在循环播放并设置一个名为active的字段,该字段可以是truefalse。但是在循环结束时,我想将这个集合分成两组。active = falseactive = true,所以这样做我不需要在数据库中搜索两次..

例如:

    private List<Classes> searchClasses(ClassItems listItems) {

    List<ClassItem> items = new ArrayList<ClassItem>();

    for (Iterator<ClassItem> iterator = listItems.getItems().iterator(); iterator.hasNext();) {
        ClassItems item = iterator.next();
        ClassEntityManager classEnt = ClassEntityManager.search(item.getId);

        if(classEnt.active()){
            item.setActive(true);
            items.add(item);
        }
    }
    return items;
}

这样做的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

制作两个列表而不是一个。

if(classEnt.active()) {
    activeItems.add(item);
    item.setActive(true);
} else {
    inactiveItems.add(item);
}

答案 1 :(得分:0)

使用两个集合,一个用于活动,另一个用于非活动。

从数据库中提取数据时,只需将CalssItem放在正确的列表中:

private List<ClassItem> searchClasses(ClassItems listItems) {

    List<ClassItem> activeItems= new ArrayList<ClassItem>();
    List<ClassItem> notActiveItems= new ArrayList<ClassItem>();

    Iterator<ClassItem> i = listItems.getItems().iterator();
    while(i.hasNext()) { //This is a better approach.
        ClassEntityManager classEnt = ClassEntityManager.search(i.next().getId);

        if(classEnt.active()){
            item.setActive(true);
            activeItems.add(item);
        }else{
            item.setActive(false);
            notActiveItems.add(item);
        }
    }
    List<ClassItem> ret = new ArrayList<ClassItem>(activeItems);
    ret.addAll(notActiveItems);
    return ret;
}

但是,通过这种方式,activeItemsnotActiveItems都无法缓解。最好的办法是在您的方法中设置一个外部循环,以检查ClassItem是否处于活动状态。这样,activeItemsnotActiveItems都可以从方法中删除:

private List<ClassItem> searchClasses(ClassItems listItems) {

    List<ClassItem> items= new ArrayList<ClassItem>();

    Iterator<ClassItem> i = listItems.getItems().iterator();
    while(i.hasNext()) { //This is a better approach.
        ClassEntityManager classEnt = ClassEntityManager.search(i.next().getId);

        item.setActive(classEnt.active());

        items.add(item);
    }

    return items;
}

并使用清单:

List<ClassItem> items = searchClasses(classItems);
for(ClassItem item: items){
    if(item.isActive()){
        //do something
    }else{
        //do something else
    }
}

更好的是使用华丽而美观的Java 8 Stream API:

List<ClassItem> active = items.stream().filter(x->x.isActive).collect(Collectors.toList());

List<ClassItem> notActive = items.stream().filter(x->!x.isActive).collect(Collectors.toList());

或一个班轮:

List<ClassItem> active = searchClasses(classItems).stream().filter(x->x.isActive).collect(Collectors.toList());

注意

您的代码的返回类型为List<Classes>,而返回的值为List<ClassItem>。哪个是对的?

您的迭代器具有泛型类型ClassItem,而next()方法返回ClassItems对象。哪个是对的?