【发布时间】:2013-08-29 03:13:40
【问题描述】:
假设我有一个项目列表,每个项目都由一个简单的结构定义
struct simpleItem
{
String Category1;
String Category2;
...
String CategoryN;
}
每个项目都有一系列属于某些类别的值。 在处理列表时,类别数 N 是已知的,并且每个项目具有相同数量的类别,并且每个类别只有一个值,没有重复的项目。 但是,每个列表都可以有不同的类别集。
我正在寻找一种按类别对这些项目进行分组的方法,如果通过组合类别的每个排列将这些组解构为单个项目,我将得到原始组合,没有重复。
一组结果将是:
struct grouped
{
String[] Category1;
String[] Category2;
...
String[] CategoryN;
}
示例
为了这个例子,我们将限制为 3 个类别,但可以有 N 个。
类别
动物、眼睛颜色、毛皮“动物”类别的选择:猫、狗、鼠、马
“眼睛颜色”类别的选择:蓝色、黄色、绿色、红色、橙色
“毛皮”类别的选择:长、短、卷曲
如果列表包含这 3 个类别的所有排列,则最终结果将是
第 1 组:
动物 [猫、狗、鼠、马]
眼睛颜色【蓝、黄、绿、红、橙】
毛皮 [长、短、卷]
如果我有一个子列表,例如:
- 猫,蓝,长
- 猫,蓝色,短
- 狗,蓝,长
- 狗,蓝色,短
- 狗,青龙
- 大鼠,红色,短
- 老鼠,蓝色,短
我们称这个列表为 Input (A)
将这些项目分组后,我们最终可能会得到:(可能还有其他可能性)。 分组标准是尽可能少的输出组。
第 1 组:
动物 [猫、 狗]
眼睛颜色 [蓝色 ]
毛皮 [长、短]
第 2 组:
动物 [狗]
眼睛颜色 [绿色]
毛皮 [长]
第 3 组:
动物 [老鼠 ]
眼睛颜色【红、蓝】
毛皮 [短 ]
我们称这些组为输出(B)
如我们所见,通过组合结果组的每个项目,我们将返回到 (A) 中 7 个元素的原始输入列表。
问题
所以,我正在尝试编写一个生成这些组的算法。我正在尝试使用 LINQ 执行此操作,但我也愿意接受其他建议。 关于如何从(A)到(B)有什么建议吗?
【问题讨论】:
-
同一个输入很容易有多个输出。算法是否应该根据某些标准选择“最佳”算法?例如,微不足道的输出将由每个列表项组成一个组(忽略重复项)。
-
抱歉,我可能没有正确理解您的问题,但这 7 项、7 组中的每一项不都是一个人吗?
-
@kol 好点。标准应该是尽可能少的输出组。我会更新问题以反映这一点。谢谢。