[英]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.