我正在寻找一种从一组给定对象生成对象组合的方法顺序无关紧要(不是排列而是组合),例如。说。我有一个A,B,C,D的列表,我需要选择其中的3个..然后我应该得到一个列表
ABC ACD BCD
在目标C中有一个有效的逻辑吗?
答案 0 :(得分:0)
这里的关键在于技术。我在评论中链接的问题有基础。算法如下:
1)从前n个元素开始
2)增加最终元素直到它处于最终位置
3)将前一个元素向前移动一个,并将最后一个元素重置到前一个元素之后的位置
4)重复步骤2和步骤3,直到前一个元素和最后一个元素处于最后两个位置
5)将前一个元素向前移动1,并将末尾的两个元素重置为前一个元素之后的位置
6)重复这个过程直到所有元素都在最后
简化它就变成了这个:
虽然组合数组的第一个元素小于原始数组和组合数组之间的差异,但执行以下操作:
虽然组合数组的最后一个元素小于原始数组增加最后一个元素的计数长度,但从原始数组中获取结果索引
之后,检查前一个元素。如果它小于lastElement -1,则递增它并将lastElement设置为前一个元素+ 1并重复上述步骤。如果没有,则检查前一个元素,依此类推。如果它们都是顺序的,那么你就完成了。
为了帮助这个算法,我建议制作一个与你的组合大小相匹配的索引数组。假设你想要一个5元素数组的3元素组合。创建第一个索引的3元素数组:
<强> [0,1,2] 强>
首先应用上面的算法,你会增加最后的元素直到结束 [0,1,3] [0,1,4]
然后,增加前一个并重置最后一个 [0,2,3]
重复上述步骤,直到最后两个位于最终位置 [0,2,4] [0,3,4]
沿 [1,2,3] [1,2,4] [1,3,4] [2,3,4] 行向下移动,现在所有指数都在最后的位置,你完成了。
但是,我不打算在Objective-C中编写这个,因为实现算法是每个程序员都需要的。我认为这将是您获得成功的充分信息。答案 1 :(得分:0)
是的,你有。 这并不困难,但冗长。 只需要为字符数量采取循环。 请看下面的代码。
NSMutableArray *arr_Combinations = [[NSMutableArray alloc] init];
NSString *str_First;
NSString *str_Second;
NSString *str_Third;
for (NSInteger firCount = 0; firCount < 4; firCount++)
{
NSMutableArray *arr_First = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", @"D", nil];
str_First = [arr_First objectAtIndex:firCount];
[arr_First removeObjectAtIndex:firCount];
for (NSInteger secCount = 0; secCount < [arr_First count]; secCount++)
{
NSMutableArray *arr_Second = [[NSMutableArray alloc] initWithArray:arr_First];
str_Second = [str_First stringByAppendingString:[arr_Second objectAtIndex:secCount]];
[arr_Second removeObjectAtIndex:secCount];
for (NSInteger thirCount = 0; thirCount < [arr_Second count]; thirCount++)
{
NSMutableArray *arr_Third = [[NSMutableArray alloc] initWithArray:arr_Second];
str_Third = [str_Second stringByAppendingString:[arr_Third objectAtIndex:thirCount]];
[arr_Third removeObjectAtIndex:thirCount];
for (NSInteger fothCount = 0; fothCount < [arr_Third count]; fothCount++)
{
NSString *str_Final = [str_Third stringByAppendingString:[arr_Third objectAtIndex:fothCount]];
NSLog(@"%@", str_Final);
[arr_Combinations addObject:str_Final];
}
}
}
}
NSLog(@"%d", [arr_Combinations count]);