[英]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.