1

私はNSMutableArrayタイプのオブジェクトを持っていますNSMutableDictionary

NSMutableDictionaryは2つのキーが含まれています

・航空会社(文字列)

-評価 (整数)

私はNSMutableArrayすべてのオブジェクトを持っています。必要なのは、すべての航空会社の繰り返しオブジェクトの評価を合計することです。例:

Airline  Rating

  A         2

  B         3

  B         4

  C         5

最終結果の配列は、A = 2、C = 5、および 7 に等しい B の合計になります。

これまでの私のコード:

for (int i = 0; i < arrayMealRating.count; ++i) {
         NSMutableDictionary *item = [arrayMealRating objectAtIndex:i];
         NSLog(@"item=%@",item);
         for (int j = i+1; j < arrayMealRating.count; ++j)
         {
           if ([[item valueForKey:@"Airline"] isEqualToString:[arrayMealRating objectAtIndex:j]]){
                NSMutableDictionary *item = [arrayMealRating objectAtIndex:j];
                NSMutableDictionary *item1 = [arrayMealRating objectAtIndex:i];
                NSInteger auxCount =  [[item valueForKey:@"setMealRating"] integerValue] + [[item1 valueForKey:@"setMealRating"] integerValue];

                NSMutableDictionary *aux = [NSMutableDictionary dictionaryWithObjectsAndKeys:[item valueForKey:@"Airline"], @"Airline"
                                                        ,[NSString stringWithFormat:@"%d",auxCount], @"setMealRating"
                                                        ,nil];
                NSLog(@"aux=%@",aux);
                [arrayMealRating replaceObjectAtIndex:i withObject:aux];

            }
         }
   }

少し厄介なことはわかっていますがNSMutableDictionary、 の操作方法がわかりません。どんな助けでも大歓迎です。よろしくお願いします。

4

3 に答える 3

5

データの保存方法を変更したくない場合は、キーと値のコーディングを使用してそれを行う方法を次に示します。@distinctUnionOfObjects および @sumのドキュメントへの直接リンクを次に示します。

// Get all the airline names with no duplicates using the KVC @distinctUnionOfObjects collection operator
NSArray *airlineNames = [arrayMealRating valueForKeyPath:@"@distinctUnionOfObjects.Airline"];

// Loop through all the airlines
for (NSString *airline in airlineNames) {

    // Get an array of all the dictionaries for the current airline
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(Airline == %@)", airline];
    NSArray *airlineMealRating = [arrayMealRating filteredArrayUsingPredicate:predicate];

    // Get the sum of all the ratings using KVC @sum collection operator
    NSNumber *rating = [airlineMealRating valueForKeyPath:@"@sum.Rating"];
    NSLog(@"%@: %@", airline, rating);
}

これにより、次の出力が得られます

A: 2
B: 7
C: 5
于 2012-10-29T16:32:56.340 に答える
1

@これを試して

NSMutableArray *myArray = [[NSMutableArray alloc] initWithCapacity:4];

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSNumber numberWithInteger:2] forKey:@"A"];
[myArray addObject:dict];

NSMutableDictionary *dict2 = [[NSMutableDictionary alloc] init];
[dict2 setValue:[NSNumber numberWithInteger:3] forKey:@"B"];
[myArray addObject:dict2];

NSMutableDictionary *dict3 = [[NSMutableDictionary alloc] init];
[dict3 setValue:[NSNumber numberWithInteger:4] forKey:@"B"];
[myArray addObject:dict3];

NSMutableDictionary *dict4 = [[NSMutableDictionary alloc] init];
[dict4 setValue:[NSNumber numberWithInteger:5] forKey:@"D"];
[myArray addObject:dict4];


NSMutableDictionary *resultDictionary = [[NSMutableDictionary alloc] init];

for(NSMutableDictionary *dictionary in myArray)
{
    NSString *key = [[dictionary allKeys] objectAtIndex:0];

    NSInteger previousValue = [[resultDictionary objectForKey:key] integerValue];


        NSInteger value = [[dictionary objectForKey:key] integerValue];

        previousValue += value;



    [resultDictionary setObject:[NSNumber numberWithInteger:previousValue] forKey:key];

}

for(NSString *key in resultDictionary)
{
    NSLog(@"value for key = %@ = %d",key, [[resultDictionary valueForKey:key] integerValue]);
}
于 2012-10-29T16:16:47.190 に答える
1

可能であれば、完全に再設計することをお勧めします。

クラスを作成するAirline

@interface Airline : NSObject

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSMutableArray *mealRatings;

- (void)addMealRating:(float)rating;
- (float)sumOfMealRatings;

@end


@implementation

- (id)initWithName:(NSString *)pName
{
    self = [super init];
    if (self)
    {
        self.name = pName;
        self.mealRatings = [NSMutableArray array];
    }
    return self;
}

- (void)addMealRating:(float)rating
{
    [self.mealRatings addObject:@(rating)];
}

- (float)sumOfRatings
{
    float sum = 0;
    for (NSNumber *rating in self.mealRatings)
    {
        sum += [rating floatValue];
    }
 }

 @end

次に、「メインクラス」で、オブジェクトのNSArraywith インスタンスを保持するだけです。Airline既存のコードの一部を変更する必要があるかもしれませんが、長期的には時間と手間を省けると思います。後で、航空会社に追加のプロパティを追加したいと思うかもしれません。辞書はそれを行うのに面倒な方法です。

于 2012-10-29T16:12:36.127 に答える