Как реализовать "группировать по значениям" в NSMutableArray? - PullRequest
8 голосов
/ 20 декабря 2011

Я использую NSMutableArray. Я хочу получить значения по дате, как мы делаем в 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";
    }
)

** Итак, я только что выступил ....

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

Но я хочу получить только УНИКАЛЬНЫЕ даты. ** Я думал о NSPredicate или Mutable Set и т.д ...

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"
)

Заранее спасибо .....

EDIT:

Я также слышал о "@distinctUnionOfObjects"

......

Ответы [ 5 ]

14 голосов
/ 20 декабря 2011

Ответ Шанти близок.Вы хотите использовать оператор коллекции Key-Value Coding @distinctUnionOfObjects.Поместите оператор непосредственно перед ключом, на который вы хотите повлиять, как если бы он был частью пути к ключу, к которому вы обращаетесь:

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

Обратите внимание на использование valueForKeyPath:, а не valueForKey: Первый - это метод в протоколе Key-Value Coding и позволяет получить доступ к произвольной глубине атрибутов.Путь к ключу NSString состоит из разделенных точками ключей.Результат каждого поиска ключа по очереди используется для доступа к следующему ключу (начиная с исходного получателя);по умолчанию valueForKey: просто вызывается на каждом шаге.

3 голосов
/ 20 декабря 2011

Вы должны использовать NSSet для УНИКАЛЬНЫХ предметов, таких как:

NSSet *filteredData = [NSSet setWithArray:[logMuArray valueForKey:@"log_date"]];
3 голосов
/ 20 декабря 2011

Для этого вы можете использовать KVC .

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

edit: Редактирование этого ответа Джоша

[logMuArray valueForKeyPath:@"@distinctUnionOfArrays.log_date"]
1 голос
/ 20 декабря 2011

Попробуйте, эта логика может вам помочь

-(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;
}
0 голосов
/ 20 декабря 2011

Вы можете включить набор

Вот пример кода

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

, а вот вывод

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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...