2013-03-13 59 views
13

我有一個NSArray,數組中的每個對象都有一個groupId和一個名字。每個對象都是唯一的,但有許多具有相同的groupId。有沒有一種方法可以將數組拆分並重建它,以便將名稱與相應的groubId分組爲單個對象?以下是該數組目前的樣子:通過對具有匹配ID號的對象進行分組來重建NSArray?

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

回答

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

編輯:編輯爲不承擔密鑰的數據類型。

+0

'的NSString * ID = [NSNumber的numberWithInt:〔O objectForKey:@ 「的groupId」]];''numberWithInt '接受'int'作爲參數並返回'NSNumber'。你提供一個'id'參數並分配給'NSString'。 – Sebastian 2013-03-13 02:10:04

1

這與舍瓦的回答,但可以將其添加爲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"]; 
}]; 

This isn' t與原始答案完全相同,因爲它會將人字典保留爲數組中的值,但是您可以只讀取名稱屬性。

1

快速執行Sergery的答案,爲我的同伴noobs。

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) 

請注意valueForKeyPath中的@符號。絆倒我一點:)

0

以下的代碼通過分組對象WRT任何匹配鍵在每個字典該數組

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

// 從字典再次轉換爲陣列中重建一個NSArray .. 。

self.finalArray = [[NSMutableArray alloc]init]; 
for (NSString *uniqueKey in aMutableArray) { 
    NSDictionary *aUniqueKeyDict = @{@"groupKey":uniqueKey,@"featureValues":[dictFromArray objectForKey:uniqueKey]}; 
    [self.finalArray addObject:aUniqueKeyDict]; 
} 

希望它可以幫助..

相關問題