java - 带有列表的Java中嵌套循环的动态数量
问题描述
我在 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;
}
如何获得具有不同数量嵌套循环的所有组合?
我相信我必须编写一个递归函数来处理它,但我很困惑。
解决方案
而不是使用递归,我会通过一个循环和一个表示、、、等的计数器数组来实现你的*动态嵌套循环i
。j
你k
总是会增加最后一个可能的计数器,代表最里面的循环,直到它到达结尾,在在这种情况下,您将重置它,将其外部的循环加一,然后继续。
假设你有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
。
推荐阅读
- python - 为什么我会为同一个数据集得到不同的输出?
- android - 我试过了,通知应该在指定的时间给我?
- r - 如何在R中的for循环中按名称对数据进行排序
- wso2-am - WSO2 APIM 发布者在加载时卡住了
- angular - 如何为highcharts背景导出具有指定填充颜色的highcharts?
- java - 如何解决声纳警告 - 为 SELECT BETWEEN 使用变量绑定机制
- javascript - 如何将元素数组转换为 JSONPath 语法?
- python - 根据 2 列中的条件值删除行
- java - 我在文本字段中输入到另一个文本字段的第一个数字未显示
- c# - 当我尝试创建 ADO.NET Entity Data Mods:el 时发生错误。错误说