6

请注意,这适用于 OSX,而​​不适用于 iOS。

我在其他 SO 问题中查看并尝试了一些解决方案,但似乎没有一个对我有用,因此:

我想从数组中获得一组独特的年份。

我的代码是这样的:

NSMutableArray * unique = [NSMutableArray array];
        NSMutableSet * processed = [NSMutableSet set];
        for (yearString in yearStringArray) {
            if (![processed containsObject:yearString] == NO) {
                [unique addObject:yearString];
            }
            [processed addObject:yearString];
        }

        NSLog(@"unique: %@",unique );
        NSLog(@"processed: %@",processed );

    }];

The console returns:

unique: (
        (
        1941,
        1942,
        1943,
        1945,
        1948,
        1948,
        1948,
        1949
    )

processed: {(
        (
        1941,
        1942,
        1943,
        1945,
        1948,
        1948,
        1948,
        1949
    )
)}

我只想要一个 1948。我将不胜感激。

更新:感谢大家的回答。请让他们来!

这些是我现在尝试过的代码片段:

1.

for (yearString in yearStringArray) {
            if ([processed containsObject:yearString] == NO) {
                [unique addObject:yearString];
            }
            [processed addObject:yearString];
        }

2.

   NSString *yearString = [[NSString alloc] init];
    NSArray *objectArray = [[NSArray alloc] init];
    [objectArray = objects copy];

    for (int j = 0; j <= objectArray.count; j++) {
        NSString *yearString = [objectArray valueForKey:@"year"];
        [yearStringArray addObject:yearString];
    }


    NSMutableArray * unique = [NSMutableArray array];
    NSMutableSet * processed = [NSMutableSet set];


    for (yearString in yearStringArray) {

        [unique addObject:yearString];
        [processed addObject:yearString];
    }

    NSArray *processed2 = [[NSSet setWithArray:unique] allObjects];
    NSLog(@"unique: %@",unique );
    NSLog(@"processed: %@",processed );
    NSLog(@"processed2: %@",processed2 );
    //[self setYears];
}];

3.

NSString *yearString = [[NSString alloc] init];
    NSArray *objectArray = [[NSArray alloc] init];
    [objectArray = objects copy];

    for (int j = 0; j <= objectArray.count; j++) {
        yearString = [objectArray valueForKey:@"year"];
        [yearStringArray addObject:yearString];
    }



    NSArray *uniqueYears = [yearStringArray valueForKeyPath:@"@distinctUnionOfObjects.self"];
    NSLog(@"uniqueYears: %@", uniqueYears);


}];



}

仍然没有得到独特的年份..

4

4 回答 4

27

一种简单的方法是从具有重复项的数组中创建一个NSSet。结果是根据定义仅存储唯一对象的集合。然后使用 NSSet 的-allObjects方法将其转换NSSetNSArray. 唯一的缺点是您通过转换为NSSet.

NSArray *uniqueArray = [[NSSet setWithArray:duplicateArray] allObjects];

如果您需要保留顺序并且可能需要 10.7+,则可以使用NSOrderedSet.

NSArray *uniqueArray = [[NSOrderedSet orderedSetWithArray:duplicateArray] array];

编辑:

感谢WWDC 2013 Session 228 中的Mattt Thompson - Cocoa 和 Cocoa Touch 中的隐藏宝石,还有另一种无需创建中间集的方法。

NSArray *uniqueArray = [duplicateArray valueForKeyPath:@"@distinctUnionOfObjects.self"]
于 2013-10-15T05:38:36.583 回答
8

您可以使用数组valueForKeyPath并将其设置为distinctUnionOfObjects.self.

NSArray *yearsArray = @[@"1943", @"1945", @"1948", @"1948", @"1948", @"1949"];
NSArray *uniqueYears = [yearsArray valueForKeyPath:@"@distinctUnionOfObjects.self"];
NSLog(@"uniqueYears: %@", uniqueYears);
于 2013-10-15T05:39:54.493 回答
2

您提供了一个NSLog

unique: (
    (
    1941,
    1942,
    1943,
    1945,
    1948,
    1948,
    1948,
    1949
    ) 
) 

这不是字符串数组。这是一个包含一个对象的数组,该对象本身就是一个数组。这表明yearStringArray具有相同的结构。显然,您的代码(以及该变量的名称)表明您认为它应该是其他的。

您应该修复创建的任何内容yearStringArray以实际创建字符串数组,或者更改代码以反映这种结构yearStringArray,例如,

for (yearString in yearStringArray[0]) 
{
    ....
}
于 2013-10-15T06:48:10.047 回答
1

这是错误。

if (![processed containsObject:yearString] == NO)

你必须使用

if ([processed containsObject:yearString] == NO)

或者

if (![processed containsObject:yearString])
于 2013-10-15T05:38:30.000 回答