订购的唯一组合
本文关键字:组合 唯一 | 更新日期: 2023-09-27 17:51:08
我有以下类:
internal class Course
{
public int CourseCode { get; set; }
public string DeptCode { get; set; }
public string Name { get; set; }
}
和下面的代码是我的二维数组:
Course[][] courses = new Course[3][];
courses[0] = new Course[] {
new Course() { CourseCode = 100, DeptCode = "EGR", Name = "EGR A" },
new Course() { CourseCode = 100, DeptCode = "EGR", Name = "EGR B" }
};
courses[1] = new Course[] {
new Course() { CourseCode = 200, DeptCode = "EN", Name = "EN A" }
};
courses[2] = new Course[] {
new Course() { CourseCode = 300, DeptCode = "PHY", Name = "PHY A" }
};
我想做的是得到一组中每个项目可以与其他组进行的不同组合;例如,使用前面的代码,结果将是:
1. EGR A - EN A - PHY A
2. EGR B - EN A - PHY A
回答:为了得到可能的组合数量,我们可以使用乘积法则,在上面的例子中,可能的组合将是(2 * 1 * 1)= 2,这确实是我上面写的两种组合。
LordTakkera给出了完美的答案,非常感谢!
可以使用嵌套的for循环:
for (int i = 0; i < courses[0].Length; i++)
{
for (int j = 0; j < courses[1].Length; i++)
{
for (int k = 0; k < courses[2].Length; i++)
{
//Do whatever you need with the combo, accessed like:
//courses[0][i], courses[1][j], courses[2][k]
}
}
}
当然,你需要的嵌套越多,这个解决方案就越混乱。如果您需要更深入地研究,我将使用某种递归函数来遍历集合并生成组合。
应该是这样的:
class CombinationHelper
{
public List<List<Course>> GetAllCombinations(Course[][] courses)
{
return GetCourseCombination(courses, 0);
}
public List<List<Course>> GetCourseCombination(Course[][] courses, int myIndex)
{
List<List<Course>> combos = new List<List<Course>>();
for (int i = 0; i < courses[myIndex].Length; i++)
{
if (myIndex + 1 < courses.GetLength(0))
{
foreach (List<Course> combo in GetCourseCombination(courses, myIndex + 1))
{
combo.Add(courses[myIndex][i]);
combos.Add(combo);
}
}
else
{
List<Course> newCombination = new List<Course>() { courses[myIndex][i] };
combos.Add(newCombination);
}
}
return combos;
}
}
我对此进行了测试(将"Course"替换为"int"以使验证更容易),它产生了所有8种组合(尽管不是按顺序,递归倾向于这样做)。如果我想出了排序代码,我会发布的,但它不应该是太困难)。
递归函数对我来说已经够难的了,所以我的解释不会很好。基本上,我们从"0"索引开始(这样我们就从头开始)。然后遍历当前数组。如果我们不是"主"数组中的最后一个数组,我们递归到下一个子数组。否则,我们创建一个新的组合,将我们自己加入其中,然后返回。
当递归堆栈"展开"时,我们将生成的组合添加到返回列表中,将我们自己添加到其中,然后再次返回。最终,整个过程"展开",你将得到一个包含所有组合的列表。
再一次,我确信这是一个非常令人困惑的解释,但递归算法(至少对我来说)本质上令人困惑。
查看第二个索引- 0或1。如果你只看这个,你会看到一个从0到7的二进制数。
从0数到7,把它转换成比特,得到你需要的组合模式