2

DiaryEntry オブジェクトの NSArray があり、各 DiaryEntry には NSDate date_ フィールドがあります。

すべての DiaryEntry を曜日ごとにグループ化してテーブル ビューに表示したいと考えています。各グループは日付の昇順で並べ替えられています。

そのため、NSArray を取り、配列の NSDictionary に変換する必要があります。キーは曜日 (NSDate) で、値は DiaryEntrys の NSArray で、date_ フィールドの昇順で並べられています。

これはかなり一般的な操作だと思いますが、サンプル コードはどこにも見つかりません。

どんな助けでも大歓迎です。

ありがとう!!

4

4 に答える 4

1

さて、あなたの DiaryEntry には日付プロパティがあると思います。これは簡単で汚いバージョンです。これをもっと良くすることができます。

NSMutableDictionary *map = [[[NSMutableDictionary alloc] init] autorelease];
NSMutableArray *array;
for (DiaryEntry *entry in myArray) {
    array = [map objectForKey:entry.date];
    if (!array) {
        array = [[[NSMutableArray alloc] init] autorelease];
        [map setObject:array forKey:entry.date];
    }
    [array addObject:entry];
}

メソッド名/コンパイルのコードを再確認します...私はここでそれを翼にしていますが、基本的には次のとおりです。

リストに目を通します。見つかった各エントリについて、その日付に関連付けられた配列があるかどうかを確認します。そうでない場合は、作成します。その配列に追加します。

構造を配列に変更することを検討することをお勧めします... 7 日以上の土地に住んでいない限り、特定の順序で格納された配列を格納できます。大量のオブジェクトがあり、すばやく検索したい場合を除き、マップ構造をできるだけ避けようとします。

于 2010-01-25T14:22:53.593 に答える
1

以下はうまくいくはずです(実際にはコードをコンパイルしてテストしませんでした)

            NSEnumerator* enumerator;
            DiaryEntrys* currEntry;
            NSMutableDictionary* result;

            /*
             use sorting code from other answer, if you don't sort, the result will still contain arrays for each day of the week but arrays will not be sorted
             */
            [myArray sortUsingDescriptors:....];
            /*
             result holds the desired dictionary of arrays
             */
            result=[[NSMutableDictionary alloc] init];
            /*
             iterate throught all entries
             */
            enumerator=[myArray objectEnumerator];
            while (currEntry=[enumerator nextObject])
            {
                NSNumber* currDayOfTheWeekKey;
                NSMutableArray* dayOfTheWeekArray;
                /*
                 convert current entry's day of the week into something that can be used as a key in an dictionary
                 I'm converting into an NSNumber, you can choose to convert to a maningfull string (sunday, monday etc.) if you like
                 I'm assuming date_ is an NSCalendarDate, if not, then you need a method to figure out the day of the week for the partictular date class you're using

                 Note that you should not use NSDate as a key because NSDate indicates a particular date (1/26/2010) and not an abstract "monday"
                 */
                currDayOfTheWeekKey=[NSNumber numberWithInt:[[currEntry valueForKey:@"date_"] dayOfWeek]];
                /*
                 grab the array for day of the week using the key, if exists
                 */
                dayOfTheWeekArray=[result objectForKey:currDayOfTheWeekKey];
                /*
                 if we got nil then this is the first time we encounter a date of this day of the week so
                 we create the array now
                 */
                if (dayOfTheWeekArray==nil)
                {
                    dayOfTheWeekArray=[[NSMutableArray alloc] init];
                    [result setObject:dayOfTheWeekArray forKey:currDayOfTheWeekKey];
                    [dayOfTheWeekArray release];    // retained by the dictionary
                }
                /*
                 once we figured out which day the week array to use, add our entry to it.
                 */
                [dayOfTheWeekArray addObject:currEntry];
            }
于 2010-01-26T08:02:30.427 に答える
0

私はそれをテストしませんでしたが、必要に応じて改善できるこのコードを書くことができました。


// Ordering the array ascending
            myArray = [myArray sortedArrayUsingDescriptors:
                                [NSArray arrayWithObject: 
                                 [[[NSSortDescriptor alloc] initWithKey:@"date_ field"
                                                              ascending:YES
                                                               selector:@selector(compare:)] autorelease]]];

            NSMutableDictionary *myDictionary = [[NSMutableDictionary alloc] init];
            NSMutableArray *arrayForCurrentDate = [[NSMutableArray alloc] init];
            NSString *lastDate = [myArray objectAtIndex:0];
            for (int i=0; i< [myArray count]; i++)
            {
                if (![lastDate isEqualToString:[myArray objectAtIndex:i])
                {
                    if ([arrayForCurrentDate count])
                        [myDictionary setObject:arrayForCurrentDate forKey:lastDate];
                    [arrayForCurrentDate removeAllObjects];
                    lastDate [myArray objectAtIndex:i];
                }
                [arrayForCurrentDate addObject:];
            }
            if ([arrayForCurrentDate count])
                  [myDictionary setObject:arrayForCurrentDate forKey:lastDate];

乾杯、
VFN

于 2010-01-25T14:42:47.070 に答える
0

だから、これが私の最終結果です。実際には、曜日ごとではなく、日と月ごとにオブジェクトをバケット化する必要がありました (元の投稿では明確ではありません)。

(エントリは元の配列です)

// reverse sort of entries, and put into daily buckets
-(NSMutableArray*) sortedEntries {  
    if (sortedEntries == nil) {
        NSInteger currentDay = -1;
        NSCalendar *gregorian = [NSCalendar currentCalendar];
        NSEnumerator* enumerator = [self.entries reverseObjectEnumerator];
        sortedEntries = [NSMutableArray new];
        DiaryEntry* currentEntry;
        while (currentEntry=[enumerator nextObject])
        {
            NSDate* date = [currentEntry valueForKey:@"date"];
            NSDateComponents *weekdayComponents = [gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:date];

            NSInteger newDay = [weekdayComponents day];
            if (currentDay == -1 || newDay != currentDay){
                NSMutableArray* dailyArray = [NSMutableArray new];  
                [sortedEntries addObject:dailyArray];
                [dailyArray addObject:currentEntry];
                [dailyArray release];

            } else {
                [[sortedEntries lastObject] addObject:currentEntry];
            }

            currentDay = newDay;
        }
    }

    return sortedEntries;
}
于 2010-02-01T02:52:38.660 に答える