1

さまざまな州の複数の場所を持つ配列があります。

{"location":"Lekki Phase 1","state":"abc","country":"Nigeria"},
{"location":"Lekki Phase 2","state":"xyz","country":"Nigeria"},
{"location":"Osapa London1","state":"def","country":"Nigeria"},
{"location":"Lekki Phase 2","state":"abc","country":"Nigeria"},
{"location":"Lekki Phase 3","state":"xyz","country":"Nigeria"},
{"location":"Osapa London 2","state":"def","country":"Nigeria"},..........

これで、次のように、重複する状態のないさまざまな状態の配列を作成できます

 {"abc","xyz","def"}

しかし、私が望むのは、すべての場所の状態を表に表示することです。

これどうやってするの??

4

3 に答える 3

1

まず配列ではなくDictionaryです。

NSMutableDictionary * newDict = [NSMutableDictionary dictionaryWithCapacity:[OLdDict count]];
for(id item in [OLdDict allValues]){
    NSArray * keys = [OLdDict allKeysForObject:item];
    [newDict setObject:item forKey:[[OLdDict allKeysForObject:item] objectAtIndex:0]];
}
于 2013-03-15T06:11:32.827 に答える
1

NSMutableDictionaries は、一意のコレクションとして機能できます (同じキーが 2 回使用されると、キーのオブジェクトを置き換えるため)。また、NSString は一般に一定のアドレス位置であるという事実を利用して、これらの辞書のそれぞれを配列に注ぎ込むこともできます。辞書の各配列を一意にするには、それらをオブジェクトでラップする方がはるかに簡単ですが、次のようになります。

-(void)uniquingSort {
    //Setup collections for the uniquing process
    NSMutableArray *datasource = //...
    NSMutableIndexSet *hits = [NSMutableIndexSet indexSet];
    NSMutableDictionary *uniquingDict = @{}.mutableCopy;

    //Setup an index for the indexed set
    int idx = 0;

    //iterate through the array of dictionaries
    for (NSArray *arrOfDicts in datasource) {
        //get the dictionary we want to unique against
        NSDictionary *innerDict = arrayOfDicts[1];
        //do we have a dupe?  If so, add its index to the index set
        if (uniquingDict[innerDict[@"state"]] != nil)
            [hits addIndex:idx];
        uniquingDict[innerDict[@"state"]] = innerDict[@"state"];
        idx++;
    }
    //cut out all the hits till we are only uniqued for the "state" key
    [datasource removeObjectsAtIndexes:hits];
}
于 2013-03-15T06:18:28.890 に答える
1

を使用NSPredicateすると、これを効率的にフィルタリングできます。私は自分のために働いてみました。

ここで「allDataArray」は辞書を含む配列です。ここで配列を置き換えることができます(投稿の最初のもの)

    NSMutableArray *allDataArray = [[NSMutableArray alloc] init];
    NSMutableDictionary *dict1 = [[NSMutableDictionary alloc] init];
    [dict1 setObject:@"Lekki Phase 1" forKey:@"location"];
    [dict1 setObject:@"abc" forKey:@"state"];
    [dict1 setObject:@"Nigeria" forKey:@"country"];
    [allDataArray addObject:dict1];

    dict1 = [[NSMutableDictionary alloc] init];
    [dict1 setObject:@"Lekki Phase 2" forKey:@"location"];
    [dict1 setObject:@"xyz" forKey:@"state"];
    [dict1 setObject:@"Nigeria" forKey:@"country"];
    [allDataArray addObject:dict1];

    dict1 = [[NSMutableDictionary alloc] init];
    [dict1 setObject:@"Lekki Phase 2" forKey:@"location"];
    [dict1 setObject:@"abc" forKey:@"state"];
    [dict1 setObject:@"Nigeria" forKey:@"country"];
    [allDataArray addObject:dict1];

    dict1 = [[NSMutableDictionary alloc] init];
    [dict1 setObject:@"Lekki Phase 3" forKey:@"location"];
    [dict1 setObject:@"xyz" forKey:@"state"];
    [dict1 setObject:@"Nigeria" forKey:@"country"];
    [allDataArray addObject:dict1];
    //NSLog(@"%@",allDataArray);

    NSArray *state = [NSArray arrayWithObjects:@"abc",@"xyz", nil];

    NSMutableArray *locationInState = [[NSMutableArray alloc] initWithCapacity:[state count]];
    for(int i=0; i< [state count]; i++)
    {
        NSMutableArray *filteredarray = [[allDataArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(state == %@)", [state objectAtIndex:i]]] mutableCopy];
        for(int j=0; j<[filteredarray count];j++)
        {
            NSDictionary *dict = [filteredarray objectAtIndex:j];
            [filteredarray replaceObjectAtIndex:j withObject:[dict valueForKey:@"location"]];
        }
        [locationInState addObject:filteredarray];
    }
    NSLog(@"%@",locationInState);

ここで、locationInState 配列には、filetred 状態のすべての場所が含まれています。インデックスで簡単にマップできます。

結果は

(
    (
        "Lekki Phase 1",
        "Lekki Phase 2"
    ),
        (
        "Lekki Phase 2",
        "Lekki Phase 3"
    )
)
于 2013-03-15T06:31:01.827 に答える