java - 使用数据作为树视图过滤 ArrayList
问题描述
我有一个 Detail.java 类,其中包含一些属性 id、安全性、描述、项目。Items 是一个 ArrayList 的详细信息
public class Detail {
private int id;
private boolean security;
private String description;
private List<Detail> items;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isSecurity() {
return security;
}
public void setSecurity(boolean security) {
this.security = security;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public List<Detail> getItems() {
return items;
}
public void setItems(List<Detail> items) {
this.items = items;
}
}
这个 ArrayList (treeview) 和我的数据
[
{
"id": 1,
"security": true,
"description": "description 1",
"items": [
{
"id": 11,
"security": true,
"description": "description 11"
},
{
"id": 12,
"security": false,
"description": "description 12",
"items": [
{
"id": 121,
"security": true,
"description": "description 121"
},
{
"id": 122,
"security": false,
"description": "description 122"
}
]
},
{
"id": 13,
"security": true,
"description": "description 13"
},
{
"id": 14,
"security": false,
"description": "description 14"
}
]
},
{
"id": 2,
"security": true,
"description": "description 2",
"items": [
{
"id": 21,
"security": true,
"description": "description 21"
},
{
"id": 22,
"security": false,
"description": "description 22"
},
{
"id": 23,
"security": true,
"description": "description 23"
},
{
"id": 24,
"security": false,
"description": "description 24"
}
]
}
]
我想通过过滤所有安全性为真的节点来过滤或创建这个 ArrayList
最好的方法是什么?使用迭代器?用第一个和克隆对象创建一个新的 arrayList ?如何管理物品?
谢谢你的帮助
解决方案
最近看到这个问题,所以尝试了一下。这个递归解决方案似乎对我有用:
public class Main {
// ArrayList to popluate with elements
private static List<Detail> myDetails2 = new ArrayList<>();
public static void main(String[] args) {
List<Detail> myDetails = new ArrayList<>();
// Building up some sample data
Detail detail = new Detail();
detail.setId(1);
detail.setSecurity(true);
detail.setItems(Collections.emptyList());
Detail detail5 = new Detail();
detail5.setId(6);
detail5.setSecurity(true);
detail5.setItems(Collections.emptyList());
Detail detail4 = new Detail();
detail4.setId(5);
detail4.setSecurity(true);
detail4.setItems(Arrays.asList(detail5));
Detail detail3 = new Detail();
detail3.setId(4);
detail3.setSecurity(true);
detail3.setItems(Arrays.asList(detail4));
Detail detail2 = new Detail();
detail2.setId(3);
detail2.setSecurity(true);
detail2.setItems(Arrays.asList(detail3));
Detail detail1 = new Detail();
detail1.setId(2);
detail1.setSecurity(false);
detail1.setItems(Arrays.asList(detail2));
myDetails.add(detail);
myDetails.add(detail1);
constructDetailsListWithSecurity(myDetails);
// Printing out the id of the elements that were added to the filtered ArrayList
myDetails2.forEach(d -> System.out.println("id: " + d.getId()));
}
public static void constructDetailsListWithSecurity(List<Detail> myDetails) {
if (myDetails.isEmpty()) {
return;
}
for (Detail detail : myDetails) {
if (detail.isSecurity()) {
myDetails2.add(detail);
}
if (detail.getItems() != null && !detail.getItems().isEmpty()) {
List<Detail> items = detail.getItems();
constructDetailsListWithSecurity(items);
}
}
}
}
我基本上只使用安全设置为 true 的元素填充 ArrayList(我希望我能正确理解这一点,否则我们需要稍微更改逻辑)。对于此解决方案,深度无关紧要。这意味着它仍然可以处理 Detail 对象具有 Details 列表的情况,该列表又具有 Details 列表等等。
推荐阅读
- drools - Drools - 如何在 THEN 子句中访问对象
- python - 如何获取当前位置(纬度、经度)。不使用获取IP?
- angular - 无法匹配任何路由。URL段:'服务器/基本
- javascript - 通过函数映射列表,单击时给我错误:“无法读取未定义的属性'值'”
- unity3d - Unity 触发器检测玩家是否完全脱离对撞机
- xml - 使用 itext7 和 c# 将 xml 流插入 pdf/a 名称树
- xpath - 使用 Xpath 计算标签中的特定标点符号
- c++ - 如何使用 stbi_write_png 将图像像素数据写入 png 文件
- javascript - 忽略仅包含空格的数组元素
- android - 预填充房间数据库会引发错误 - 架构似乎是错误的