What is the best approach to breakdown an Arraylist based on their values

I would like to split ArrayList

into what I loop and set a field under the name active

which can be true

or false

. But at the end of the loop, I would like to split this collection into two groups. active = false

and active = true

so I don't have to search the database twice for this.

eg:

    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;
}

      

What's the best way to do this?

+3


source to share


2 answers


Make two lists instead of one.



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

      

+2


source


Use two collections, one for active and one for inactive.

When you fetch data from DB, just put CalssItem

in the correct list:

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;
}

      

BUT, thus, both activeItems

, and notActiveItems

are inaccessible. Your best bet is to make a loop outside that checks if it is active ClassItem

or not. Thus, both methods activeItems

and notActiveItems

can be removed from a method:

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;
}

      

And use a list:

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

      



Better yet, use the gorgeous and beautiful 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());

      

or one liner:

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

      

NOTES :

Your code has a return type List<Classes>

and the return value is List<ClassItem>

. What is right?

Your iterator is of a generic type ClassItem

, while the method next()

returns an object ClassItems

. What is right?

0


source







All Articles