【问题标题】:Recursive Name Search递归名称搜索
【发布时间】:2013-06-04 09:39:38
【问题描述】:

我想在递归构建项目列表中找到一个名称。 项可以有子项,子项可以有子子项等。

对于第一个级别,它起作用了。对于更深层次,正确找到的名称/ID 映射会从堆栈中覆盖。由于字符串结果,我必须在最后编写 return 语句。所以我有一个心理障碍,我该如何解决这个问题。感谢您的帮助。

public String getNameForID(List<Item> top, long id, String name ) {

        for (Item i : top) {
            if (i.getId() == id) {
                name =  i.getName();
                return name;
            }else{
             this.getNameForID(i.getSubItemsList(), id,name);
            }

        }
        return name;
    }

【问题讨论】:

    标签: java search recursion


    【解决方案1】:

    这一定是你要找的东西:

    public String getNameById(List<Item> items, long id) {
        // boundary condition
        if (items == null || items.isEmpty()) {
            return null;
        }
        // looping
        for (Item item : items) {
            // if current is
            if (item.getId() == id) {
                return item.getName();
            }
            // recursion
            String name = getNameById(item.getSubItemsList(), id);
            // if nested found
            if (name != null) {
                return name;
            }
        }
        // boundary condition
        return null;
    }
    

    【讨论】:

      【解决方案2】:

      您对getNameForID 的递归调用必须也能够返回一个值。它还需要能够指示未找到值,以便终止递归。

      根据@sp00m 之前删除(且略有错误)的答案,试试这个:

      public String getNameById(List<Item> items, long id) {
      
          // sanity checking conditions to terminate recursion early
          if (items == null || items.isEmpty()) {
              return null;
          }
      
          // iterate over collection
          for (Item item: items) {
              if (item.getId() == id) {
                  return item.getName();
              } else {
                  String name = getNameById(item.getSubItemsList(), id);
                  if (name != null) {
                      return name;
                  }
              }
          }
      
          // final termination condition - entry wasn't in this list
          return null;
      }
      

      【讨论】:

      • @sp00m 所以你做到了 - 我发现了你原来的错误并在这里发布了一个更正的版本。取消删除你的,我会支持它。
      【解决方案3】:

      您没有将此处返回的值分配给 name

      this.getNameForID(i.getSubItemsList(), id,name);
      

      实际上您不需要参数名称 - 只需在每次调用中返回 namenull

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-11
        • 2019-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多