我有一个包含整数的列表列表(这个列表可以是任意长度,可以包含任意数量的整数:
{{1,2}, {3,4}, {2,4}, {9,10}, {9,12,13,14}}
Run Code Online (Sandbox Code Playgroud)
接下来我要做的是组合任何整数与任何其他列表中的任何整数匹配的列表,在这种情况下:
result = {{1,2,3,4}, {9,10,12,13,14}}
Run Code Online (Sandbox Code Playgroud)
我尝试了很多不同的方法,但我坚持使用优雅的解决方案.
如果你的意思是"当有一个交叉点时合并",那么可能是下面的东西,输出:
{1,2,3,4}
{9,10,12}
Run Code Online (Sandbox Code Playgroud)
注意它也在你的编辑中传递了测试,输出:
{1,2,3,4}
{9,10,12,13,14}
Run Code Online (Sandbox Code Playgroud)
码:
static class Program {
static void Main()
{
var sets = new SetCombiner<int> {
{1,2},{3,4},{2,4},{9,10},{9,12}
};
sets.Combine();
foreach (var set in sets)
{
// edited for unity: original implementation
// Console.WriteLine("{" +
// string.Join(",", set.OrderBy(x => x)) + "}");
StringBuilder sb = new StringBuilder();
foreach(int i in set.OrderBy(x => x)) {
if(sb.Length != 0) sb.Append(',');
sb.Append(i);
}
Console.WriteLine("{" + sb + "}");
}
}
}
class SetCombiner<T> : List<HashSet<T>>
{
public void Add(params T[] values)
{
Add(new HashSet<T>(values));
}
public void Combine()
{
int priorCount;
do
{
priorCount = this.Count;
for (int i = Count - 1; i >= 0; i--)
{
if (i >= Count) continue; // watch we haven't removed
int formed = i;
for (int j = formed - 1; j >= 0; j--)
{
if (this[formed].Any(this[j].Contains))
{ // an intersection exists; merge and remove
this[j].UnionWith(this[formed]);
this.RemoveAt(formed);
formed = j;
}
}
}
} while (priorCount != this.Count); // making progress
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
351 次 |
最近记录: |