Можно ли создать рекурсивный метод в java, который не вернется до того, как будут выполнены ваши критерии? - PullRequest
1 голос
/ 22 апреля 2020

Вот что я пробовал:

private static ApplicationGroup fetchDashboardParamInfo(List<ApplicationGroup> applicationGroup, String uniqueId) {
    ApplicationGroup dashParamInfo = null;
    for (ApplicationGroup a : applicationGroup) {
        if (a.getUniqueId() == null || !a.getUniqueId().equals(uniqueId)) {
            fetchDashboardParamInfo(a.getChildren(), uniqueId);
        } else if (a.getUniqueId().equals(uniqueId)) {
            dashParamInfo = a;
        }
    }
    return dashParamInfo;
}

Я просто запускаю группу приложений, которая представляет собой список групп приложений. На самом деле это иерархия групп приложений. Я пытаюсь сделать метод рекурсивным, если "if" -элемент имеет значение true, с a.getChildren () в качестве нового a. Если "else if" -элемент равен true, dashParamInfo просто должно быть равно значению a в этой точке, а затем метод должен возвращать dashParamInfo без дальнейшего зацикливания. Проблема, с которой я столкнулся, заключается в том, что когда выражение «если» становится истинным, оно не повторяется, оно входит в оператор, а затем просто возвращается и сразу завершает метод. Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 22 апреля 2020

Если в текущем applicationGroup правильный ответ не найден, вам нужно глубже рекурсировать. Но если вы делаете рекурсию, вам нужно проверить, нашел ли повторяющийся звонок то, что вы искали; если это так, вам нужно вернуть его.

private static ApplicationGroup fetchDashboardParamInfo(List<ApplicationGroup> applicationGroup, String uniqueId) {
    for (ApplicationGroup a : applicationGroup) {
        if (a.getUniqueId() == null || !a.getUniqueId().equals(uniqueId)) {
            ApplicationGroup dashParamInfo = fetchDashboardParamInfo(a.getChildren(), uniqueId);
            if (dashParamInfo != null)
                return dashParamInfo;
        } else if (a.getUniqueId().equals(uniqueId)) {
            return a;
        }
    }
    return null;
}
0 голосов
/ 22 апреля 2020

Итерация списка с использованием for l oop опровергает всю цель рекурсивной функции. Сделайте это следующим образом:

private static ApplicationGroup fetchDashboardParamInfo(List<ApplicationGroup> applicationGroup, String uniqueId) {
    if (applicationGroup.get(0).getUniqueId().equals(uniqueId)) {
        return applicationGroup.get(0);
    }
    if (applicationGroup.get(0).getUniqueId() == null || !applicationGroup.get(0).getUniqueId().equals(uniqueId)) {
        return fetchDashboardParamInfo(a.getChildren(), uniqueId);
    }
    return fetchDashboardParamInfo(applicationGroup.subList(1, applicationGroup.size()), uniqueId);       
}
0 голосов
/ 22 апреля 2020

Я думаю, что вам не хватает return до fetchDashboardParamInfo(a.getChildren(), uniqueId);

private static ApplicationGroup fetchDashboardParamInfo(List<ApplicationGroup> applicationGroup, String uniqueId) {
    ApplicationGroup dashParamInfo = null;
    for (ApplicationGroup a : applicationGroup) {
        if (a.getUniqueId() == null || !a.getUniqueId().equals(uniqueId)) {
            return fetchDashboardParamInfo(a.getChildren(), uniqueId);
        } else if (a.getUniqueId().equals(uniqueId)) {
            dashParamInfo = a;
            break;
        }
    }
    return dashParamInfo;
}
...