从NSMutableArray获取唯一项目

Gid*_*eek 13 objective-c nsmutablearray nsarray

我今天有一个关于Objective-C的问题涉及NSMutableArray.来自.net/c#背景我在处理这些事情时遇到了一些麻烦.

假设我有一个名为"Song"的对象

我的歌有3个属性:

  • 标题
  • 艺术家
  • 类型

我有一个NSMutableArray或NSArray,它拥有我所有的Song对象.

我将如何尝试"查询"我的阵列以获得仅具有(唯一)艺术家或流派的新阵列.

在.net中你会用DISTINCT子句编写一个简单的LINQ查询,如何在Objective-C中解决这个问题?我猜测谓词,但我很难找到解决方案.

提前致谢.

Luk*_*uke 36

你也可以使用:

NSArray *uniqueArtists = [songs valueForKeyPath:@"@distinctUnionOfObjects.artist"];
NSArray *uniqueGenres = [songs valueForKeyPath:@"@distinctUnionOfObjects.genre"];
Run Code Online (Sandbox Code Playgroud)

同样,如果您需要比较整个对象,您可以创建一个新的只读属性,该属性组合您想要匹配的值(通过哈希或其他方式)动态并比较:

NSArray *array = [songs valueForKeyPath:@"@distinctUnionOfObjects.hash"];
Run Code Online (Sandbox Code Playgroud)

注意:请记住,这将返回指定属性的唯一值,而不是对象本身.所以它将是一个NSString值的数组,而不是Song值.


Chu*_*uck 13

根据"独特艺术家"的含义,有几种不同的解决方案.如果您只想获得所有艺术家并且不希望任何人出现不止一次,那就去做吧[NSSet setWithArray:[songArray valueForKey:@"artist"]].如果你的意思是想要设置所有歌曲的列表,这些歌曲是他们的艺术家唯一的歌曲,你需要首先找到只做一首歌的艺术家,然后找到那些艺术家的歌曲:

NSCountedSet *artistsWithCounts = [NSCountedSet setWithArray:[songArray valueForKey:@"artist"]];
NSMutableSet *uniqueArtists = [NSMutableSet set];
for (id artist in artistsWithCounts)
    if ([artistsWithCounts countForObject:artist] == 1])
        [uniqueArtists addObject:artist];
NSPredicate *findUniqueArtists = [NSPredicate predicateWithFormat:@"artist IN %@", uniqueArtists];
NSArray *songsWithUniqueArtists = [songArray filteredArrayUsingPredicate:findUniqueArtists];
Run Code Online (Sandbox Code Playgroud)


小智 5

或者像这样:

filterTags  = [[NSSet setWithArray:filterTags] allObjects];
Run Code Online (Sandbox Code Playgroud)

filterTags 一开始并不独特,但在手术后变得独一无二.