ipodtouchdude
ipodtouchdude

Reputation: 3

iOS sdk NSArray within NSArray find and merge

I am trying to search and merge objects in multiple NSArray's.

Basically NSArray that has a multiple NSArray's with 1 object and then NSDictionary. I want check if the object exists already and merge it with the existing object so then it would be NSSArray that has a NSArray with 1 object and then multiple NSDictionary's. In Objective-c.

(
  (
    "The Essential: Céline Dion",
    {
      "album": "The Essential: Céline Dion",
      "artwork": "<UIImage: 0x608000087210>, {512, 506}",
      "title": "It's All Coming Back to Me Now"
    }
  ),
  (
    "Ah Via Musicom",
    {
      "album": "Ah Via Musicom",
      "artwork": "<UIImage: 0x60000008a6e0>, {600, 600}",
      "title": "Cliffs of Dover"
    }
  ),
  (
    "Tears Roll Down (Greatest Hits 82-92)",
    {
      "album": "Tears Roll Down (Greatest Hits 82-92)",
      "artwork": "<UIImage: 0x6080000887a0>, {512, 512}",
      "title": "Everybody Wants to Rule the World"
    }
  ),
  (
    "No Money - Single",
    {
      "album": "No Money - Single",
      "artwork": "<UIImage: 0x6080000845b0>, {600, 600}",
      "title": "No Money"
    }
  ),
  (
    "Tears Roll Down (Greatest Hits 82-92)",
    {
      "album": "Tears Roll Down (Greatest Hits 82-92)",
      "artwork": "<UIImage: 0x60800008d5c0>, {512, 512}",
      "title": "Shout"
    }
  ),
  (
    "STAB!",
    {
      "album": "STAB!",
      "artwork": "<UIImage: 0x60800008da20>, {512, 512}",
      "title": "Will You Remember Me?"
    }
  ),
  (
    "Life After Sundown",
    {
      "album": "Life After Sundown",
      "artwork": "<UIImage: 0x60000008d840>, {600, 600}",
      "title": "Werewolves On Wheels"
    }
  )
)

to this

(
  (
    "The Essential: Céline Dion",
    {
      "album": "The Essential: Céline Dion",
      "artwork": "<UIImage: 0x608000087210>, {512, 506}",
      "title": "It's All Coming Back to Me Now"
    }
  ),
  (
    "Ah Via Musicom",
    {
      "album": "Ah Via Musicom",
      "artwork": "<UIImage: 0x60000008a6e0>, {600, 600}",
      "title": "Cliffs of Dover"
    }
  ),
  (
    "Tears Roll Down (Greatest Hits 82-92)",
    {
      "album": "Tears Roll Down (Greatest Hits 82-92)",
      "artwork": "<UIImage: 0x6080000887a0>, {512, 512}",
      "title": "Everybody Wants to Rule the World"
    },
    {
      "album": "Tears Roll Down (Greatest Hits 82-92)",
      "artwork": "<UIImage: 0x60800008d5c0>, {512, 512}",
      "title": "Shout"
    }
  ),
  (
    "No Money - Single",
    {
      "album": "No Money - Single",
      "artwork": "<UIImage: 0x6080000845b0>, {600, 600}",
      "title": "No Money"
    }
  ),
  (
    "STAB!",
    {
      "album": "STAB!",
      "artwork": "<UIImage: 0x60800008da20>, {512, 512}",
      "title": "Will You Remember Me?"
    }
  ),
  (
    "Life After Sundown",
    {
      "album": "Life After Sundown",
      "artwork": "<UIImage: 0x60000008d840>, {600, 600}",
      "title": "Werewolves On Wheels"
    }
  )
)

Upvotes: 0

Views: 57

Answers (1)

The Mach System
The Mach System

Reputation: 6973

Let's call your original array of array the mainArray.

First you collect the unique names from that mainArray.

NSMutableArray *uniqueNames = [NSMutableArray array];

for (NSArray *sub in mainArray) {
    NSString *name = [sub firstObject];
    BOOL isDuplicate = [[uniqueNames filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF contains %@",name]] count] > 0;
    if (!isDuplicate) {
        [uniqueNames addObject:name];
    }
}

After that, loop through the uniqueNames array and search for duplicate in your mainArray and re-structure your array.

NSMutableArray *final = [NSMutableArray array];
for (NSString *name in uniqueNames) {
    NSPredicate *namePredicate = [NSPredicate predicateWithFormat:@"SELF contains %@",name];
    NSArray *duplicateArrays = [mainArray filteredArrayUsingPredicate:namePredicate];
    if ([duplicateArrays count] > 1) {
        NSMutableArray *newArray = [NSMutableArray arrayWithObject:name];
        for (NSArray *duplicateArray in duplicateArrays) {
            [newArray addObject:[duplicateArray lastObject]];
        }
        [final addObject:newArray];
    }
    else{
        [final addObject:duplicateArrays];
    }
}

Here the final array is your outcome.

Upvotes: 1

Related Questions