【问题标题】:Dynamic number of nested loop in java with Lists带有列表的java中嵌套循环的动态数量
【发布时间】:2019-04-07 19:51:43
【问题描述】:

我在 Java 中创建了一个函数来查找所有可能的列表组合。我只为 2 个技能创建了此代码,但由于技能的数量可能会动态变化,我需要更改我的代码以支持动态数量的嵌套循环,以找到技能的专家组合。

public List<ProjectAndTeam> teamCombinations(List<ProjectAndTeam> projectAndTeams) {
    List<ProjectAndTeam> allTeamCombinations = new ArrayList<>();
    for (ProjectAndTeam currentProjectTeam : projectAndTeams) {
        ProjectAndTeam projectAndTeam = new ProjectAndTeam();
        projectAndTeam.project = currentProjectTeam.project;
        for (int i = 0; i < currentProjectTeam.expertForSkill.get(0).expertList.size(); i++) {
            for (int j = 0; j < currentProjectTeam.expertForSkill.get(1).expertList.size(); j++) {
                ExpertForSkill expertForSkill = new ExpertForSkill();
                expertForSkill.skill = currentProjectTeam.expertForSkill.get(0).skill;
                expertForSkill.expertList.add(currentProjectTeam.expertForSkill.get(0).expertList.get(i));
                ExpertForSkill expertForSkillSecond = new ExpertForSkill();
                expertForSkillSecond.skill = currentProjectTeam.expertForSkill.get(1).skill;
                expertForSkill.expertList.add(currentProjectTeam.expertForSkill.get(1).expertList.get(j));
                projectAndTeam.expertForSkill.add(expertForSkill);
                projectAndTeam.expertForSkill.add(expertForSkillSecond);
            }
        }
        allTeamCombinations.add(projectAndTeam);
    }
    return allTeamCombinations;
}

这是我的 ProjectAndTeam、ExprtForSkill 和 Expert 类

public class ProjectAndTeam {
int id;
Project project;
List<ExpertForSkill> expertForSkill = new ArrayList<>();
double totalSalary;
double totalProductivity;
}

public class ExpertForSkill {
String skill;
List<Expert> expertList = new ArrayList<>();
}

public class Expert {
int id;
List<String> skills = new ArrayList<>();
int capacity;
double productivity;
double salary;
}

如何获得具有不同数量嵌套循环的所有组合?

我相信我必须编写一个递归函数来处理它,但我很困惑。

【问题讨论】:

  • 我强烈建议您将代码缩减为一个最小的示例。您在这里的内容有点难以理解,并且在展示您的问题方面确实没有必要。

标签: java loops recursion


【解决方案1】:

我不会使用递归,而是通过一个循环和一组表示ijk 等的计数器来实现你的*动态嵌套循环。你总是会增加最后一个可能的计数器,表示最里面的循环,直到它到达末尾,在这种情况下,您将重置它,将其外部的循环加一,然后继续。

假设您拥有n 不同的技能。簿记可能如下所示:

int[] counters = new int[n]; // i, j, k, ...

while(counters[0] < currentProjectTeam.expertForSkill.get(0).expertList.size()) {
    // Compute projectAndTeam, using loop over counters
    allTeamCombinations.add(projectAndTeam);

    for(int currentDepth = n - 1; ++counters[currentDepth] == currentProjectTeam.expertForSkill.get(currentDepth).expertList.size() && currentDepth > 0; currentDepth--) {
        counters[currentDepth] = 0;
    }
}

您可能应该有一个与counters 中的每个项目对应的技能值的数组,并在最后一个循环中更新它。这可能比在计算projectAndTeam 的循环中从头开始重新计算所有内容更容易。

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 2016-10-16
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2021-02-26
    相关资源
    最近更新 更多