有效地将数组中的元素与核心数据表行进行比较

时间:2012-05-10 14:16:02

标签: iphone objective-c core-data

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

4 个答案:

答案 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 ArrayFinding 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
)