在集合元素的集合中查找元素

时间:2020-08-14 14:56:48

标签: java recursion

一天中的好时光! 请告诉我如何正确执行以下搜索。

有很多元素,如:

class Item {
    int itemId;
    List<Item> items;
}

如何确定此类元素的集合itemId中是否存在具有指定items的元素?我知道递归搜索方法可以在这里提供帮助,但是我不知道如何正确实现它。

2 个答案:

答案 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更具递归性。

相关问题