8

I am using NSMutableArray. I want to fetch the values by date like we do in SQL group by "log_date".

logMuArray (
        {
        "log_currenttime" = "4:30pm";
        "log_date" = "11.12.2011";
        "log_duration" = "1:30";
    },
        {
        "log_currenttime" = "4:33pm";
        "log_date" = "11.12.2011";
        "log_duration" = "2:21";
    },
        {
        "log_currenttime" = "4:40pm";
        "log_date" = "11.12.2011";
        "log_duration" = "5:30";
    },
        {
        "log_currenttime" = "7:30pm";
        "log_date" = "12.12.2011";
        "log_duration" = "1:30";
    },
        {
        "log_currenttime" = "7:33pm";
        "log_date" = "12.12.2011";
        "log_duration" = "2:21";
    },
        {
        "log_currenttime" = "7:40pm";
        "log_date" = "12.12.2011";
        "log_duration" = "5:30";
    },
        {
        "log_currenttime" = "07:16pm";
        "log_date" = "19.12.2011";
        "log_duration" = "0:07";
    },
        {
        "log_currenttime" = "7:31pm";
        "log_date" = "19.12.2011";
        "log_duration" = "0:04";
    },
        {
        "log_currenttime" = "7:33pm";
        "log_date" = "19.12.2011";
        "log_duration" = "0:03";
    },
        {
        "log_currenttime" = "7:33pm";
        "log_date" = "19.12.2011";
        "log_duration" = "0:06";
    },
        {
        "log_currenttime" = "7:35pm";
        "log_date" = "19.12.2011";
        "log_duration" = "0:05";
    }
)

**So, I have just performed....

 NSLog(@"logMuArray %@",[logMuArray valueForKey:@"log_date"]);

But I want to fetch the UNIQUE dates only.** I have thought about NSPredicate or Mutable Set etc...

logMuArray (
    "11.12.2011",
    "11.12.2011",
    "11.12.2011",
    "12.12.2011",
    "12.12.2011",
    "12.12.2011",
    "19.12.2011",
    "19.12.2011",
    "19.12.2011",
    "19.12.2011",
    "19.12.2011"
)

Thanks in advance.....

EDIT:

I have also heared about "@distinctUnionOfObjects"

......

3
  • Is it possible to uniquely identify objects based on two or more keys with same logic? Commented Jul 8, 2015 at 4:10
  • Your question is good, better you should ask a question, because code is also required, so please ask your question in stack overflow. Side by side I have not much idea upon this, but I need a time to solve it. Will try to solve it, but need a code for solving it. Better you post your question at stack overflow with code. thanks Commented Jul 8, 2015 at 6:54
  • it might help you Rebuild an NSArray by grouping objects w.r.t any matching keys in each dictionary in that array Commented Jul 20, 2016 at 5:03

5 Answers 5

15

Shanti's answer is close. You want to use the Key-Value Coding collection operator @distinctUnionOfObjects. Place the operator immediately preceding the key which you want it to affect, as if it is a part of the key path you are accessing:

[logMuArray valueForKeyPath:@"@distinctUnionOfObjects.log_date"]

Notice the use of valueForKeyPath:, not valueForKey: The former is a method in the Key-Value Coding protocol, and allows accessing arbitrary depth of attributes. The key path is an NSString made up of dot-separated keys. The result of each key lookup is used in turn to access the next key (starting with the original receiver); by default, valueForKey: is simply called at each step.

Sign up to request clarification or add additional context in comments.

1 Comment

Can i used it with multiple key path such as [log_currenttime,log_date]
3

You should use NSSet for UNIQUE items like :

NSSet *filteredData = [NSSet setWithArray:[logMuArray valueForKey:@"log_date"]];

1 Comment

thanks mogs :) But previously Jash Caswell's anser is also nice and prefferable..
3

You can use KVC for this.

[logMuArray valueForKey:@"@distinctUnionOfArrays.log_date"]

edit: Editing this wrt Josh's Response

[logMuArray valueForKeyPath:@"@distinctUnionOfArrays.log_date"]

1 Comment

[logMuArray valueForKeyPath:@"@ distinctUnionOfArrays.log_date"], change valueForKey with valueForKeyPath
1

Try this logic might help you

-(NSMutableArray *) makeUnique :(NSMutableArray *) array {    
    int i;
    int count = [array count];
    for (i =0; i< count ; i++) {
        NSRange range = NSMakeRange (i+1, count); 
        [array removeObject:[array objectAtIndex:i] inRange:range];
    }
    return array;
}

Comments

0

You can incorporate a set

Here is some example code

NSMutableArray * mArray = [NSMutableArray array];
NSDictionary *d1 = [NSDictionary dictionaryWithObjectsAndKeys:@"foo",@"bar",@"bar",@"oooo",nil];
NSDictionary *d2 = [NSDictionary dictionaryWithObjectsAndKeys:@"boo",@"bar",@"bar",@"oooo",nil];
NSDictionary *d3 = [NSDictionary dictionaryWithObjectsAndKeys:@"boo",@"bar",@"bar",@"oooo",nil];
[mArray addObject:d1];
[mArray addObject:d2];
[mArray addObject:d3];
NSLog(@"the array\n%@", mArray);
NSLog(@"just bar %@", [mArray valueForKey:@"bar"]);
//get unique values
NSSet * set = [NSSet setWithArray:[mArray valueForKey:@"bar"]];
NSLog(@"unique just bar %@", [set allObjects]);

and here is the output

2011-12-20 01:50:59.034 TestEnvironment[32401:207] the array
(
        {
        bar = foo;
        oooo = bar;
    },
        {
        bar = boo;
        oooo = bar;
    },
        {
        bar = boo;
        oooo = bar;
    }
)
2011-12-20 01:50:59.036 TestEnvironment[32401:207] just bar (
    foo,
    boo,
    boo
)
2011-12-20 01:50:59.038 TestEnvironment[32401:207] unique just bar (
    foo,
    boo
)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.