我有一个NSArray,数组中的每个对象都有一个groupId和一个名字。每个对象都是唯一的,但有许多具有相同的groupId。有没有办法可以将阵列拆开并重建它,以便将名称分组为具有相应groubId的单个对象?这是数组目前的样子:
2013-03-12 20:50:05.572 appName[4102:702] the array: (
{
groupId = 1;
name = "Dan";
},
{
groupId = 1;
name = "Matt";
},
{
groupId = 2;
name = "Steve";
},
{
groupId = 2;
name = "Mike";
},
{
groupId = 3;
name = "John";
},
{
groupId = 4;
name = "Kevin";
}
)
这就是我想要的样子:
2013-03-12 20:50:05.572 appName[4102:702] the array: (
{
groupId = 1;
name1 = "Dan";
name2 = "Matt";
},
{
groupId = 2;
name1 = "Steve";
name2 = "Mike";
},
{
groupId = 3;
name = "John";
},
{
groupId = 4;
name = "Kevin";
}
)
编辑: 我试过&经过多次尝试都失败了,大多数都是这样的事情(草率娱乐,但要提出一个想法):
int idNum = 0;
for (NSDictionary *arrObj in tempArr){
NSString *check1 = [NSString stringWithFormat:@"%@",[arrObj valueForKey:@"groupId"]];
NSString *check2 = [NSString stringWithFormat:@"%@",[[newDict valueForKey:@"groupId"]];
if (check1 == check2){
NSString *nameStr = [NSString stringWithFormat:@"name_%d",idNum];
[newDict setValue:[arrObj valueForKey:@"name"] forKey:nameStr];
}
else {
[newDict setValue:arrObj forKey:@"object"];
}
idNum++;
}
答案 0 :(得分:33)
NSArray *array = @[@{@"groupId" : @"1", @"name" : @"matt"},
@{@"groupId" : @"2", @"name" : @"john"},
@{@"groupId" : @"3", @"name" : @"steve"},
@{@"groupId" : @"4", @"name" : @"alice"},
@{@"groupId" : @"1", @"name" : @"bill"},
@{@"groupId" : @"2", @"name" : @"bob"},
@{@"groupId" : @"3", @"name" : @"jack"},
@{@"groupId" : @"4", @"name" : @"dan"},
@{@"groupId" : @"1", @"name" : @"kevin"},
@{@"groupId" : @"2", @"name" : @"mike"},
@{@"groupId" : @"3", @"name" : @"daniel"},
];
NSMutableArray *resultArray = [NSMutableArray new];
NSArray *groups = [array valueForKeyPath:@"@distinctUnionOfObjects.groupId"];
for (NSString *groupId in groups)
{
NSMutableDictionary *entry = [NSMutableDictionary new];
[entry setObject:groupId forKey:@"groupId"];
NSArray *groupNames = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"groupId = %@", groupId]];
for (int i = 0; i < groupNames.count; i++)
{
NSString *name = [[groupNames objectAtIndex:i] objectForKey:@"name"];
[entry setObject:name forKey:[NSString stringWithFormat:@"name%d", i + 1]];
}
[resultArray addObject:entry];
}
NSLog(@"%@", resultArray);
输出:
(
{
groupId = 3;
name1 = steve;
name2 = jack;
name3 = daniel;
},
{
groupId = 4;
name1 = alice;
name2 = dan;
},
{
groupId = 1;
name1 = matt;
name2 = bill;
name3 = kevin;
},
{
groupId = 2;
name1 = john;
name2 = bob;
name3 = mike;
}
)
答案 1 :(得分:2)
这需要NSArrays的NSDictionary。没有快速而优雅的方式 - 你必须滚动浏览源。
NSMutableDictionary *d = [NSMutableDictionary dictionaryWithCapacity:10]; //Or use alloc/init
for(SomeObject o in appname) //What's the type of objects? you tell me
{
NSObject *ID = [o objectForKey: @"groupId"];
NSMutableArray *a = [d objectForKey: ID];
if(a == nil)
{
a = [NSMutableArray arrayWithCapacity: 10];
[d setObject:a forKey: ID];
}
[a addObject: [o objectForKey: @"name"]];
}
编辑:编辑后不假设密钥的数据类型。
答案 2 :(得分:1)
这与Seva的答案类似,但它可以作为NSArray的类别方法添加:
/// @return A dictionary of NSMutableArrays
- (NSDictionary *)abc_groupIntoDictionary:(id<NSCopying>(^)(id object))keyFromObjectCallback {
NSParameterAssert(keyFromObjectCallback);
NSMutableDictionary *result = [NSMutableDictionary dictionary];
for (id object in self) {
id<NSCopying> key = keyFromObjectCallback(object);
NSMutableArray *array = [result objectForKey:key];
if (array == nil) {
array = [NSMutableArray new];
[result setObject:array forKey:key];
}
[array addObject:object];
}
return [result copy];
}
你可以像这样使用它:
NSDictionary *groups = [people abc_groupIntoDictionary:^id<NSCopying>(NSDictionary *person) {
return person[@"groupId"];
}];
这与原始答案不完全相同,因为它会将人员字典保存为数组中的值,但您可以只读取该名称属性。
答案 3 :(得分:1)
迅速实施Sergery给我的同伴们的答案。
class People: NSObject {
var groupId: String
var name : String
init(groupId: String, name: String){
self.groupId = groupId
self.name = name
}
}
let matt = People(groupId: "1", name: "matt")
let john = People(groupId: "2", name: "john")
let steve = People(groupId: "3", name: "steve")
let alice = People(groupId: "4", name: "alice")
let bill = People(groupId: "1", name: "bill")
let bob = People(groupId: "2", name: "bob")
let jack = People(groupId: "3", name: "jack")
let dan = People(groupId: "4", name: "dan")
let kevin = People(groupId: "1", name: "kevin")
let mike = People(groupId: "2", name: "mike")
let daniel = People(groupId: "3", name: "daniel")
let arrayOfPeople = NSArray(objects: matt, john, steve, alice, bill, bob, jack, dan, kevin, mike, daniel)
var resultArray = NSMutableArray()
let groups = arrayOfPeople.valueForKeyPath("@distinctUnionOfObjects.groupId") as [String]
for groupId in groups {
var entry = NSMutableDictionary()
entry.setObject(groupId, forKey: "groupId")
let predicate = NSPredicate(format: "groupId = %@", argumentArray: [groupId])
var groupNames = arrayOfPeople.filteredArrayUsingPredicate(predicate)
for i in 0..<groupNames.count {
let people = groupNames[i] as People
let name = people.name
entry.setObject(name, forKey: ("name\(i)"))
}
resultArray.addObject(entry)
}
println(resultArray)
注意@ sign in valueForKeyPath。这让我感到很沮丧:)
答案 4 :(得分:0)
下面的代码将重建NSArray,方法是将对象w.r.t分组到该数组中每个字典中的任何匹配键
//only to a take unique keys. (key order should be maintained)
NSMutableArray *aMutableArray = [[NSMutableArray alloc]init];
NSMutableDictionary *dictFromArray = [NSMutableDictionary dictionary];
for (NSDictionary *eachDict in arrOriginal) {
//Collecting all unique key in order of initial array
NSString *eachKey = [eachDict objectForKey:@"roomType"];
if (![aMutableArray containsObject:eachKey]) {
[aMutableArray addObject:eachKey];
}
NSMutableArray *tmp = [grouped objectForKey:key];
tmp = [dictFromArray objectForKey:eachKey];
if (!tmp) {
tmp = [NSMutableArray array];
[dictFromArray setObject:tmp forKey:eachKey];
}
[tmp addObject:eachDict];
}
//NSLog(@"dictFromArray %@",dictFromArray);
//NSLog(@"Unique Keys :: %@",aMutableArray);
// 再次从字典转换为数组......
self.finalArray = [[NSMutableArray alloc]init];
for (NSString *uniqueKey in aMutableArray) {
NSDictionary *aUniqueKeyDict = @{@"groupKey":uniqueKey,@"featureValues":[dictFromArray objectForKey:uniqueKey]};
[self.finalArray addObject:aUniqueKeyDict];
}
希望它有所帮助......