获取唯一对象的数组

时间:2014-05-11 19:17:13

标签: ios objective-c arrays

我有一系列日期:

"2014-05-09 23:00:00 +0000",
"2014-05-09 23:00:00 +0000",
"2014-05-09 23:00:00 +0000",
"2014-05-09 23:00:00 +0000",
"2014-05-09 23:00:00 +0000",
"2014-05-09 23:00:00 +0000",
"2014-05-11 23:00:00 +0000",
"2014-05-11 23:00:00 +0000"

我想把这个数组分成两个不同的,并放入一个数组,

我想要的结果:

(
    "2014-05-09 23:00:00 +0000",
    "2014-05-09 23:00:00 +0000",
    "2014-05-09 23:00:00 +0000",
    "2014-05-09 23:00:00 +0000",
    "2014-05-09 23:00:00 +0000",
    "2014-05-09 23:00:00 +0000",

),
    (
    "2014-05-11 23:00:00 +0000",
    "2014-05-11 23:00:00 +0000"
)

以下是我尝试的内容:

self.tempDatesArray - array of dates (unique)
tempArray - array of all dates

self.tempDatesArray = [[[NSOrderedSet orderedSetWithArray:[self.tempDatesArray copy]] array] mutableCopy]; // i'm getting all the unique dates from array

if (self.tempDatesArray.count > 0){
                for (int j=0;j<self.tempDatesArray.count;j++){
                    if (tempArray[i] == self.tempDatesArray[j]){

                        [tempArray2 addObject:tempArray[i]]; // temp array

                        if (j++){

                            NSLog(@"i is %i",i);

                            [resultArray addObject:tempArray2];

                            NSLog(@"test %@",self.sectionsArray);

                            tempArray2 = [@[] mutableCopy];
                            }
                        }
                    }
            }

我的结果是:

(
        "2014-05-09 23:00:00 +0000",
        "2014-05-09 23:00:00 +0000",
        "2014-05-09 23:00:00 +0000",
        "2014-05-09 23:00:00 +0000",
        "2014-05-09 23:00:00 +0000",
        "2014-05-09 23:00:00 +0000",
        "2014-05-11 23:00:00 +0000"
    ),
        (
        "2014-05-11 23:00:00 +0000"
    )

我因此而感到沮丧,是否有人能让我朝着正确的方向前进?

4 个答案:

答案 0 :(得分:2)

又一种方法:

NSMutableArray *result = [NSMutableArray new];
[[arrayOfDates valueForKeyPath:@"@distinctUnionOfObjects.self"] enumerateObjectsUsingBlock:^(NSDate *date, NSUInteger idx, BOOL *stop) {

    NSIndexSet *indexSet = [arrayOfDates indexesOfObjectsPassingTest:^BOOL(NSDate *d, NSUInteger idx, BOOL *stop) {
        return [d isEqual:date];
    }];

    [result addObject:[arrayOfDates objectsAtIndexes:indexSet]];
}];

答案 1 :(得分:1)

我认为这样的事情应该有效:

NSArray * allDates = @[...];

NSSet * uniqueDates = [NSSet setWithArray:allDates];

NSMutableArray * groupedDatesArray = [NSMutableArray array];
for (NSDate * uniqueDate in uniqueDates) {
    NSMutableArray * sharedDateArray = [NSMutableArray array];
    for (NSDate * newDate in allDates) {
        if ([newDate isEqualToDate:uniqueDate]) {
            [sharedDateArray addObject:uniqueDate];
        }
    }
    [groupedDatesArray addObject:sharedDateArray];
}

NSLog(@"GroupedDates: %@", groupedDatesArray);

答案 2 :(得分:1)

NSSet *set = [NSSet setWithArray:self.tempDateArray];
NSMutableArray  *groupedArray = [NSMutableArray array];

for (NSDate *date in [set allObjects]) {

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF = %@", date];
    NSArray *matchingArray = [self.tempDateArray filteredArrayUsingPredicate:predicate];
    [groupedArray addObject:matchingArray];
}

答案 3 :(得分:0)

首先,你说你正在寻找独特的对象,但是在预期的结果中你有很多重复的东西。你真的想在这做什么?

我怀疑您的第二个2014-05-11 23:00:00 +0000正在丢失,因为将它放入有序集合会将它们合并为一个条目。当第二个05-11条目添加到集合中时,该集合显示“我已经拥有:它不是唯一的”。

为什么并非所有重复的2014-05-09 23:00:00条目都会合并?我不确定。我必须看到更多的代码。也许是浮点问题。毕竟,自参考日期以来,NSDates基本上是围绕浮点的大包装器。比较浮点是一个愚蠢的差事。

还有其他让我对你的代码感到困惑的事情,但在我花时间试图弄清楚你在做什么和为什么之前,你真的想删除你的副本吗?如果是这样,重复之间你有什么宽容?是23:00:00和23:00 00.1相同吗? 23:00:00.0001

或者你只是想把阵列分解成基于日的子阵列?