8

私は Person クラスのカスタムオブジェクトの配列を持っています

Person : NSObject{
    NSString *firstName;
    NSString *lastName; 
    NSString *age;
}

NSMutableArray *personsArray = [NSMutableArray array];
Person  *personObj1 =  [[[Person alloc]  init] autorelease];
personObj1.firstName = @"John";
personObj1.lastName = @"Smith";
personObj1.age = @"25";
[personsArray addObject: personObj1];

Person  *personObj2 =  [[[Person alloc]  init] autorelease];
personObj2.firstName = @"John";
personObj2.lastName = @"Paul";
personObj2.age = @"26";
[personsArray addObject: personObj2];

Person  *personObj3 =  [[[Person alloc]  init] autorelease];
personObj3.firstName = @"David";
personObj3.lastName = @"Antony";
personObj3.age = @"30";
[personsArray addObject: personObj3];

現在、personsArray には Person オブジェクトの 3 つのオブジェクトが含まれています。

age や firstName などの属性でこのオブジェクトをグループ化できますか?

私の期待される結果は

NSDictionary {
    "John" = >{
        personObj1, //(Its  because personObj1 firstName is John )
        personObj2 //(Its  because personObj2 firstName is John )
    },
    "David" = >{
        personObj3, //(Its  because personObj3 firstName is David )
    },
}

NSDictionary を作成し、次に personsArray を反復処理し、最初にそれぞれを確認することで、この結果を取得できることを知っています

NSMutableDictionary *myDict = [NSMutableDictionary dictionary];

  for (Person *person in personsArray){

    if([myDict objectForKey: person.firstName]){
        NSMutableArray *array = [myDict objectForKey: person.firstName];
        [array addObject:person];
        [myDict setObject: array forKey:person.firstName];
    }else{
        NSMutableArray *array = [NSMutableArray arrayWithObject:person];
        [myDict setObject: array forKey:person.firstName];
    }
    }

    NSLog(@"myDict %@", myDict);

//Result myDict will give the desired output. 

しかし、もっと良い方法はありますか?

を使用している場合 @distinctUnionOfObjects、文字列オブジェクトのみでグループ化できます (そのようなカスタム オブジェクトではありません。よろしいですか?)。

事前に答えてくれてありがとう。

4

6 に答える 6

12

この回答をチェックしてください。あなたが望むものと非常によく似ています

https://stackoverflow.com/a/15375756/1190861

あなたの場合のコードは次のようになります。

NSMutableDictionary *result = [NSMutableDictionary new];

NSArray *distinctNames;
distinctNames = [personsArray valueForKeyPath:@"@distinctUnionOfObjects.firstName"];
for (NSString *name in distinctNames) {
    NSPredicate predicate = [NSPredicate predicateWithFormat:@"firstName = %@", name]; 
    NSArray *persons = [personsArray filteredArrayUsingPredicate:predicate];
    [result setObject:persons forKey:name];
}

NSLog(@"%@", result);
于 2014-05-22T03:24:33.990 に答える
3

これは、配列のカスタム オブジェクトの並べ替えです。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Firstname" ascending:NO selector:@selector(compare:)];

[Array sortUsingDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
于 2012-05-30T12:46:55.337 に答える
3

私は、 Linq-to-ObjectiveCと呼ばれる小さなライブラリを作成しました。これは、配列のクエリを容易にする多くのメソッドを提供します。必要なグループ操作を実行するには、次の操作を行うだけです。

NSDictionary* groupedByName = [personsArray groupBy:^id(id person) {
   return [person firstName];
}];

これは、キーが個別の名前である辞書を返します。各値は、指定された名前を持つ「人」オブジェクトの配列です。

于 2013-03-06T06:17:04.963 に答える
1
- (NSDictionary *)groupObjectsInArray:(NSArray *)array byKey:(id <NSCopying> (^)(id item))keyForItemBlock
{
    NSMutableDictionary *groupedItems = [NSMutableDictionary new];
    for (id item in array)
    {
        id <NSCopying> key = keyForItemBlock(item);
        NSParameterAssert(key);

        NSMutableArray *arrayForKey = groupedItems[key];
        if (arrayForKey == nil)
        {
            arrayForKey = [NSMutableArray new];
            groupedItems[key] = arrayForKey;
        }
        [arrayForKey addObject:item];
    }
    return groupedItems;
}
于 2014-03-14T13:31:00.163 に答える
0

それを行うのに役立つドロップインコード、

    -(NSMutableArray *)sortArray:(NSArray *)arrayTosort withKey:(NSString *)key ascending:(BOOL)_ascending
{
    NSSortDescriptor *sortDescriptor;
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:key
                                                 ascending:_ascending] ;
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    return [[arrayTosort sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];
}

ここでキーはkeyまたはkeypathです。

于 2012-05-30T13:08:46.387 に答える
0

には組み込みの group by メソッドはありませんNSArray。実装例をカテゴリとして追加できます。

残念ながら、@distinctUnionOfObjects操作は firstName プロパティの文字列のみを返します: John、David. 操作はしませんし、group byそのような操作もありません。

回収業務

于 2012-05-30T17:08:17.153 に答える