2011-12-20 10 views
8

Używam NSMutableArray. Chcę pobrać wartości według daty, tak jak robimy w SQL group by "log_date".Jak zaimplementować "grupa według wartości" w NSMutableArray?

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

** Tak, właśnie wykonywane ....

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

Ale chcę pobrać tylko unikalnej dat. ** myślałem o NSPredicate lub zmienny Zestaw 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" 
) 

góry dzięki .....

EDIT:

Mam również słyszał o "@distinctUnionOfObjects"

......

+0

Czy można jednoznacznie zidentyfikować obiektów na podstawie dwóch lub więcej kluczy z tą samą logiką? –

+0

Twoje pytanie jest dobre, lepiej zadaj pytanie, ponieważ kod jest również wymagany, więc zadaj pytanie w przepełnieniu stosu. Obok siebie nie mam zbyt wielkiego pomysłu, ale potrzebuję czasu, aby go rozwiązać. Postaram się go rozwiązać, ale potrzebuję kodu do jego rozwiązania. Lepiej opublikuj swoje pytanie przy przepełnieniu stosu za pomocą kodu. dzięki –

+0

może ci pomóc [Przebuduj NSArray, grupując obiekty w.r.t dowolne pasujące klucze w każdym słowniku w tej tablicy] (http: // stackoverflow.com/questions/15375528/rebuild-an-nsarray-by-grouping-objects-that-have-matching-id-numbers/38472661 # 38472661) – umakanta

Odpowiedz

14

odpowiedź Shanti jest blisko. Chcesz użyć operatora kolekcji kodowania klucz-wartość @distinctUnionOfObjects. Umieść operator bezpośrednio poprzedzających klucz którym chcesz to mieć wpływ, a jeśli jest to część kluczowej drogi jesteś korzystającego:

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

Zauważ użycie valueForKeyPath: nie valueForKey: Była to metoda w Kluczowy protokół kodowania i umożliwia dostęp do dowolnej głębokości atrybutów. Kluczową ścieżką jest NSString składająca się z klawiszy rozdzielonych kropkami. Wynik każdego wyszukiwania klucza jest używany z kolei w celu uzyskania dostępu do następnego klawisza (zaczynając od oryginalnego odbiornika); domyślnie valueForKey: jest po prostu wywoływany w każdym kroku.

+0

Czy mogę go używać z wieloma ścieżkami kluczowymi, takimi jak [log_currenttime, log_date] – wod

3

Można użyć KVC do tego.

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

edit: Edycja Response tego WRT Josha

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

Dlaczego to daje mi błąd ... sygnał przerwać ... ??? Proszę odpowiedz –

+0

[logMuArray valueForKeyPath: @ "@ distinctUnionOfArrays.log_date"], zmień wartośćForKey z valueForKeyPath – Raj

3

Należy użyć NSSet unikalnych przedmiotów, takich jak:

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

to działa dla mnie dobrze ... parul przejdź –

+0

dzięki mogs :) Ale wcześniej anser Jash Caswell jest również miły i prefferable .. –

+0

Twoje powitanie ... nie ma znaczenia – Maulik

0

Można włączyć zestaw

Oto przykład kod

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

i tu jest wyjście

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

spróbować tej logiki może pomóc

-(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; 
} 
Powiązane problemy