0

好的。我有一个带有歌曲名的数组。我还有一个包含一些相同歌曲名称的 CoreData 数据库。如何有效地检查两者中的歌曲?我真的不想使用 for 循环将数据库中的每首歌曲与数组中的所有元素进行比较。我还需要知道 CD Array 中的 songnames 数组中的哪些元素编号。谁能帮我?谢谢!

4

4 回答 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 回答