一天中的好时光! 请告诉我如何正确执行以下搜索。
有很多元素,如:
class Item {
int itemId;
List<Item> items;
}
如何确定此类元素的集合itemId
中是否存在具有指定items
的元素?我知道递归搜索方法可以在这里提供帮助,但是我不知道如何正确实现它。
答案 0 :(得分:2)
这是一个图形结构。要搜索这样的结构,您应该使用一些搜索算法,例如BFS / DFS。 使用深度优先搜索的示例。
class Item {
private String name;
private boolean visisted;
private List<Item> items;
public boolean isVisisted() {
return visisted;
}
public void setVisisted(boolean visisted) {
this.visisted = visisted;
}
public List<Item> getItems() {
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
}
class DFS {
private Stack<Item> stack;
public DFS(Stack<Item> stack) {
this.stack = stack;
}
public void dfs(List<Item> items) {
for (Item i : items) {
if (!i.isVisisted()) {
i.setVisisted(true);
dfsStack(i);
}
}
}
public void dfsStack(Item rootItem) {
this.stack.add(rootItem);
rootItem.setVisisted(true);
while (!stack.isEmpty()) {
Item actualItem = this.stack.pop();
for (Item i : actualItem.getItems()) {
if (!i.isVisisted()) {
i.setVisisted(true);
this.stack.push(i);
}
}
}
}
}
答案 1 :(得分:0)
您可以尝试
Item myItem = items.stream()
.filter(item -> searchedId == item.getItemId())
.findAny() // or findFirst, depending on your needs
.orElse(null);
然后,您可以创建一个方法,该方法返回一个布尔值,说明myItem是否为null。
此方法应类似于
public boolean existsItem(int searchedId) {
Item myItem = items.stream()
.filter(item -> searchedId == item.getItemId())
.findAny() // or findFirst, depending on your needs
.orElse(null);
return myItem != null;
}
此方法必须在您的类中。
您还应该为属性itemId和item创建getter和setter(这是一种好习惯,每个IDE都可以通过菜单上的简单提示来生成它们)。
无需比在items属性中使用Item更具递归性。