簡體   English   中英

NSArray和NSDictionary

[英]NSArray and NSDictionary

我在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];

我怎樣才能做到這一點? 我迷路了,你們能幫我嗎?

您是否不能遍歷原始數組,詢問每個字典,鍵“ user”的對象是否為1,如果是,則將該對象復制到索引為0的新數組中? 或者,如果您的用戶編號按計數順序,甚至索引編號等於該用戶編號。 然后重復“ user” = 2,等等。然后創建一個字典,以便每個鍵/對象對都是由keys數組中的鍵(keys [i])和新數組中的對象(objects [i])創建的。

你嘗試了什么?

這是一些直接輸入答案的代碼,因此尚未經過測試:

您尚未為原始數組指定名稱,因此我們假設它是:

NSArray *originalArray;

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

NSMutableDictionary *points = [NSMutableDictionary new];

現在我們需要處理原始數組中的每個元素,並且它是一個字典:

for(NSDictionary *item in originalArray)
{

points數組中獲取與item匹配的當前條目。 您不會為您的條目提供類型,因此我們將使用id

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

如果這是currentUser的第一次出現,則currentValues將為nil ,我們需要為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];

高溫超導

您可以這樣做(代碼未經測試)

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

另一個可能的解決方案(適用於任意數量的用戶):

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

大量的方法。 這是另一個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM