2012-12-08 143 views
0

我在NSArray中有NSDictionaries就像下面一樣。NSArray和NSDictionary

陣列(詞典( 「用戶」:1, 「P1」:1),詞典( 「用戶」:2, 「P1」:3), 詞典( 「用戶」:1, 「P1」 :5),字典(「用戶」: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]; 

我該怎麼做?我迷路了,你們能幫我嗎?

+0

謝謝這麼多。我沒有太多時間,所以只嘗試了Martin的解決方案,它對我很有幫助。 –

回答

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]; 
+0

非常感謝。像一個魅力工作 –

2

難道你只是遍歷你的原始數組,詢問每個字典對象的鍵「用戶」是1,如果是的話,將對象複製到索引0的新數組?或者,如果您的用戶號碼按計數順序排列,甚至可能索引號碼等於用戶號碼。然後重複「user」= 2等。然後創建一個字典,以便每個鍵/對象都由鍵陣列(鍵[i])中的鍵和新陣列中的對象(objects [i])創建。

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]; 
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 
    ); 
} 
1

你嘗試過什麼?

下面是一些代碼輸入直接到答案,因此它並沒有進行測試:

你還沒爲你的原始陣列的名稱,讓我們假定它是:

NSArray *originalArray; 

我們需要一個可變字典存儲結果:

NSMutableDictionary *points = [NSMutableDictionary new]; 

現在我們需要將原來的數組中的每個元素的過程,它是二ctionary:

for(NSDictionary *item in originalArray) 
{ 

獲取points陣列匹配item當前條目。你不給類型條目,所以我們將使用id

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

如果這是currentUser第一次出現那麼currentValuesnil,我們需要創建爲p1值的數組,它添加到points

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

+0

非常簡單的解決方案! (似乎在'item [set @「p1」]''處有一個小錯字) –

+0

@MartinR - 謝謝,修正。 – CRD