2014-01-24 29 views
0

我有一個對象數組,每個對象都有一個日期。 我想在另一個數組上組合每個對象具有相同的日期。 我的想法是這樣的:按對象日期對數組排序,對於數組上的每個對象執行此操作:如果索引i處的對象與索引i + 1處的對象日期相同,則將索引i處的對象添加到臨時數組;否則將索引i處的對象添加到臨時數組中,將該數組添加到我的輸出數組中,並從我的臨時數組中刪除所有對象。另一個陣列上的數組元素

我的代碼是這樣的:

- (void) group{ 
NSMutableArray *aux = [[NSMutableArray alloc] init]; 
MyObject *currentObject; 
MyObject *nextObject; 

// Sort array 
NSArray *sortedArray; 
sortedArray = [_storeManager.activities sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
    NSDate *first = [(MyObject *)a date]; 
    NSDate *second = [(MyObject *)b date]; 
    return [first compare:second]; 
}]; 

// Grouping array 
if ([sortedArray count] > 0) { 
    for (int i = 0; i < [sortedArray count] -1 ; i++) { 
     currentObject = sortedArray[i]; 
     nextObject = sortedArray[i+1]; 
     int currentDayObject = [currentObject getDayOfDate]; 
     int currentMonthObject = [currentObject getMonthOfDate]; 
     int currentYearObject = [currentObject getYearOfDate]; 
     int nextDayObject = [nextObject getDayOfDate]; 
     int nextMonthObject = [nextObject getMonthOfDate]; 
     int nextYearObject = [nextObject getYearOfDate]; 
     if ((currentDayObject == nextDayObject) && (currentMonthObject == nextMonthObject) && (currentYearObject == nextYearObject)) { 
      [aux addObject:currentObject]; 
     } else { 
      [aux addObject:currentObject]; 
      [_grouped addObject:aux]; 
      [aux removeAllObjects]; 
     } 
    } 
    [_grouped addObject:aux]; 
} 

爲什麼,如果我做NSLog(@"items on grouped %d",[_grouped count]);,它總是返回0?

+0

「我想在另一個陣列上將每個對象與同一日期進行分組。 使用NSMutableDictionary(鍵=日期,值=相同日期對象數組)將在你的情況下工作? – Piyuesh

回答

0

你可以用濾波器陣列與關鍵路徑做它爲您提供了不同的日期的所有對象:

NSArray *distinct = [_storeManager.activities valueForKeyPath:@"@distinctUnionOfObjects.date"] 

現在你必須創建循環枚舉所有對象,並斷言其過濾日期:

for(NSString *dateAsString in distinct) 
{ 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date == %@)", dateAsString]; 
    NSArray *arrayForTheSameDay = [_storeManager.activities filteredArrayUsingPredicate: predicate]; 
} 

您只需要修改此代碼以匹配您的屬性。

擴展:

如果你想不理你需要創建開始日期和結束日期的時間,並更改謂語:從字符串特定的格式

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", startDate, endDate]; 

要創建的NSDate您可以使用NSDateFormatter,這裏有很多例子。

+0

謝謝,是否有可能只從日期過濾年,月,日? 因爲日期對象有小時和秒,所以它們都是不同的。 – emattiazzi

+0

@mattyahtzee實現你想要的最快捷的方法是創建nsdateformatter,當你添加對象到數組並且格式化日期時只包含年月和日。 – Greg

+0

從哪個數組?不幸的是,我無法修改數組_storeManager.activities,因爲小時和分鐘對應用程序的另一部分很有用。 – emattiazzi

0

建議:使用NSMutableDictionary,日期爲鍵,NSMutableArray爲值。

您不必對初始數組進行排序。只需遍歷它,並查看您遇到的每個日期,看看該日期的密鑰是否已經在字典中。如果沒有,則創建一個數組並將其添加到字典中,並將日期作爲鍵。如果找到日期,則獲取與該鍵相對應的數組並添加新對象。

最後,你應該有一個NSMutableDictionary作爲關鍵所有不同的日期,所有相應的對象作爲這些關鍵的值。把它想象成頻率分析。

至於你的分組計數爲零的問題,對不起,我沒有按照代碼。

+0

不幸的是我應該使用一個NSMutableArray。 – emattiazzi

相關問題