好的。我有一个带有歌曲名的数组。我还有一个包含一些相同歌曲名称的 CoreData 数据库。如何有效地检查两者中的歌曲?我真的不想使用 for 循环将数据库中的每首歌曲与数组中的所有元素进行比较。我还需要知道 CD Array 中的 songnames 数组中的哪些元素编号。谁能帮我?谢谢!
问问题
270 次
4 回答
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。
于 2012-05-10T15:23:26.193 回答
2
如果你的歌曲名数组是一个标准的 NSArray,你别无选择,只能执行线性搜索操作(即 for 循环)。如果您使用不同的数据结构(如排序数组),您可以通过进行二分半搜索而不是线性搜索来查找匹配项,从而在一定程度上缩短执行时间。
于 2012-05-10T14:24:15.510 回答
1
NSArray 文档中有关于查询数组和查找数组中的对象的部分。只需使用 和 的组合,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
}
}
于 2012-05-11T03:15:32.983 回答
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
)
于 2012-05-10T23:09:01.760 回答