奥基。我有一个带有歌名的数组。我还有一个带有一些相同歌名的CoreData数据库。如何有效地检查两者中的哪些歌曲?我真的不想通过使用for循环将数据库中的每首歌与数组中的所有元素进行比较。我还需要知道CD阵列中的歌曲名数组中的哪些元素编号。谁能帮我?谢谢!
答案 0 :(得分:5)
您可以将两个数组添加到两个不同的集合中,然后找到该交集。这将在两个集合中为您提供共同对象(在您的情况下为歌曲名称)。
示例:
NSSet *set1 = [[NSSet alloc] initWithObjects:@"one",@"two", nil];
NSSet *set2 = [[NSSet alloc] initWithObjects:@"one",@"none", nil];
NSMutableSet *set3 = [[NSMutableSet alloc] initWithSet:set1];
[set3 intersectSet:set2];
在您的情况下,您可以使用initWithArray方法。
答案 1 :(得分:2)
如果您的歌曲名称数组是标准的NSArray,您别无选择,只能执行线性搜索操作(即for循环)。如果您使用不同的数据结构(如排序数组),您可以通过执行二分半搜索而不是线性搜索来缩短执行次数,以查找匹配项。
答案 2 :(得分:1)
NSArray文档包含Querying an Array和Finding Objects in an Array部分。只需使用containsObject:
和'indexOfObject:
的组合,您仍然需要迭代从数据库返回的歌曲。
NSArray *fetchResults = [NSArray arrayWithObjects:@"Song1", @"Song2", @"Song3", nil];
for(id song in myArray) {
if([fetchResults containsObject:song]) {
int index = [fetchResults indexOfObject:song];
// do something with value
}
}
答案 3 :(得分:0)
最后我用交叉点解决了这个问题。 Zahreelay指出了我正确的方向,但我需要做一些不同于代码的事情。如果将来其他人可能从这个解决方案中受益,我决定发布它。
NSMutableArray *playlist = [[NSMutableArray alloc] initWithObjects:@"Walk", @"The Pretender", @"Best Of You", @"Everlong",nil];
NSMutableArray *coredataArray =[[NSMutableArray alloc] initWithObjects:@"Walk", @"Everlong",nil];
NSMutableArray *array = [[NSMutableArray alloc] init];
int tracknum = 0;
for (id obj in spilleliste) {
if ([stemmeliste containsObject:obj] ) {
NSNumber *tracknumber = [NSNumber numberWithInt:tracknum];
[array addObject:tracknumber];
}
tracknum++;
}
NSLog(@"Array: %@",array);
输出:
2012-05-11 01:08:20.154 compare[19936:207] Array : (
0,
3
)