递归名称搜索

时间:2013-06-04 09:39:38

标签: java search recursion

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

第一级它起作用了。对于更深层次,正确找到的名称/ 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;
    }

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

您对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;
}

答案 2 :(得分:0)

您不会将此处返回的值分配给名称

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

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