[英]What is the best approach to split an Arraylist based on their values
我想拆分一个我正在循环的ArrayList
,并设置一个名为active
的字段,可以是true
或false
。 但是在循环结束时,我想将这个集合分成两组.active active = false
和active = 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;
}
这样做的最佳方法是什么?
制作两个列表而不是一个。
if(classEnt.active()) {
activeItems.add(item);
item.setActive(true);
} else {
inactiveItems.add(item);
}
使用两个集合,一个用于活动,另一个用于非活动。
从数据库中获取数据时,只需将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;
}
但是,通过这种方式, activeItems
和notActiveItems
都是activeItems
notActiveItems
的。 最好的办法是在方法之外设置一个循环来检查ClassItem
是否处于活动状态。 这样,可以从方法中删除activeItems
和notActiveItems
:
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
对象。 哪个是对的?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.