0

NSArrayには以下のようなNSDictionariesがあります。

array(dictionary( "user":1、 "p1":1)、dictionary( "user":2、 "p1":3)、dictionary( "user":1、 "p1":5)、dictionary( "ユーザー":2、" p1 ":7))

そして、この配列を以下のような辞書に変えたいと思います。

NSArray *u1 = [NSArray arrayWithObjects:@"1", @"5", nil];
NSArray *u2 = [NSArray arrayWithObjects:@"3", @"7", nil];
keys = [NSArray arrayWithObjects:@"u1", @"u2", nil];
points = [NSDictionary dictionaryWithObjectsAndKeys:u1, @"u1", u2, @"u2", nil];

どうやってやるの?私は迷子になっています、皆さんは私を助けてくれませんか?

4

5 に答える 5

2

キー「user」のオブジェクトが1であるかどうかを各辞書に尋ねて、元の配列を繰り返し処理し、そうである場合は、オブジェクトをインデックス0の新しい配列にコピーしませんか?または、ユーザー番号がカウント順になっている場合は、インデックス番号をユーザー番号と同じにすることもできます。次に、「user」= 2などについて繰り返します。次に、各キーとオブジェクトのペアがキー配列のキー(keys [i])と新しい配列のオブジェクト(objects [i])によって作成されるように辞書を作成します。

于 2012-12-08T16:52:36.873 に答える
1

何を試しましたか?

回答に直接入力されたコードがいくつかあるため、テストされていません。

元の配列に名前を付けていないので、次のように仮定します。

NSArray *originalArray;

結果を保存するには、変更可能な辞書が必要です。

NSMutableDictionary *points = [NSMutableDictionary new];

次に、元の配列のすべての要素を処理する必要があります。これは辞書です。

for(NSDictionary *item in originalArray)
{

pointsに一致する配列の現在のエントリを取得しitemます。エントリにタイプを指定しないため、次を使用しますid

   id currentUser = [item objectForKey:@"user"];
   NSMutableArray *currentValues = [points objectForKey:currentUser];

これが最初に出現する場合は、currentUsercurrentValuesなり、値nilの配列を作成して次のアドレスに追加する必要があります。p1points

   if (currentValues == nil)
      [points addObject:[NSMutableArray arrayWithObject:[item objectForKey:@"p1"]
                                                 forKey:currentUser
                        ]
      ]

p1それ以外の場合は、値を配列に追加するだけです。

   else
      [currentValues setObject:[item objectForKey:@"p1"]];

ループを閉じてキーを取得します。

}

NSArray *keys = [points allKeys];

Xcode 4.5を使用している場合は、その一部に最新の構文を使用できます。

NSMutableDictionary *points = [NSMutableDictionary new];
for(NSDictionary *item in originalArray)
{
   id currentUser = item[@"user"];
   NSMutableArray *currentValues = points[currentUser];
   if (currentValues == nil)
      points[currentUser] = [NSMutableArray arrayWithObject:item[@"p1"];
   else
      [currentValues addObject:item[@"p1"]];
}
NSArray *keys = [points allKeys];

HTH

于 2012-12-08T17:42:59.737 に答える
0

あなたはこのように行うことができます(コードはテストされていません)

NSMutableArray *keys=[NSMutableArray new];
NSMutableArray *u1=[NSMutableArray new]; 
NSMutableArray *u2=[NSMutableArray new];
NSMutableDictionary  *points=[NSMutableDictionary new];

for (id dict in array){
    NSString *user=[dict objectForKey:@"user"];
    NSString *p1=[dict objectForKey:@"p1"];
    [keys addObject:[NSString stringWithFormat:@"%@",user]];
    if( [user isEqualToString:@"1"] ){
        [u1 addObject:user];
    }
    else{
        [u2 addObject:user];
    }
}

points=[NSDictionary dictionaryWithObjectsAndKeys:u1,@"u1",u2, @"u2", nil];
于 2012-12-08T17:24:45.377 に答える
0

別の可能な解決策(任意の数のユーザーで機能します):

NSArray *orig = @[
    @{@"user" : @"1", @"p1" : @"1"},
    @{@"user" : @"2", @"p1" : @"3"},
    @{@"user" : @"1", @"p1" : @"5"},
    @{@"user" : @"2", @"p1" : @"7"},
];

// Create set of all users (without duplicates)
NSSet *users = [NSSet setWithArray:[orig valueForKey:@"user"]];

NSMutableDictionary *points = [NSMutableDictionary dictionary];
for (NSString *user in users) {
    // newKey = "u" + username, e.g. "u1" or "u2":
    NSString *newKey = [@"u" stringByAppendingString:user];

    // newValue = array of "p1" values of the current user:
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"user == %@", user];
    NSArray *newValue = [[orig filteredArrayUsingPredicate:pred] valueForKey:@"p1"];

    // Add to dictionary:
    [points setObject:newValue forKey:newKey];
}
NSLog(@"%@", points);

出力:

{
    u1 =     (
        1,
        5
    );
    u2 =     (
        3,
        7
    );
}

そして、キーはによって取得することができます

NSArray *keys = [points allKeys];
于 2012-12-08T17:31:41.263 に答える
0

たくさんのアプローチ。別のものがあります:

NSArray *originalArray = @[
    @{@"user":@"u1", @"p1":@"1"},
    @{@"user":@"u2", @"p1":@"3"},
    @{@"user":@"u1", @"p1":@"5"},
    @{@"user":@"u2", @"p1":@"7"}
];

NSLog(@"originalArray = %@", originalArray);

NSMutableDictionary *results = [NSMutableDictionary dictionary];

for (NSDictionary *dictionary in originalArray) {
    NSString *user = dictionary[@"user"];
    NSString *p1   = dictionary[@"p1"];

    if (!results[user])
        results[user] = [NSMutableArray array];

    [results[user] addObject:p1];
}

NSLog(@"results = %@", results);

それには:

originalArray = (
        {
        p1 = 1;
        user = u1;
    },
        {
        p1 = 3;
        user = u2;
    },
        {
        p1 = 5;
        user = u1;
    },
        {
        p1 = 7;
        user = u2;
    }
)

そして与える

results = {
    u1 =     (
        1,
        5
    );
    u2 =     (
        3,
        7
    );
}
于 2012-12-08T17:40:08.707 に答える