1

我有两个数组。

第一个数组只是一个国家名称列表,按非常特定的顺序排列。

countryNames = ["Canada", "USA", "Mexico"];

第二个数组是国家对象的集合。

countries = [ {name: "USA", foo: "bar"}, {name: "Italy", foo: "bar"}, {name: "Canada", foo: "bar"}, {name: "Mexico", foo: "bar"} ]

我需要countries使用countryNames数组进行过滤,同时保留countryNames.

我的第一次尝试正确过滤,但不保留顺序:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name in %@", countryNames];
NSArray *filteredCountries = [countries filteredArrayUsingPredicate:predicate];

我认为正在发生的事情是保留了国家/地区的顺序,减去未在countryNames.

有任何想法吗?

4

3 回答 3

0

字典是无序的集合。里面没有顺序。您应该维护一个数组中的键,该数组将保持顺序,然后使用数组对象进行排序。请查看此链接以供参考。

谢谢。

于 2012-06-19T16:08:54.767 回答
0

国家应该保持项目被发现的顺序。最简单的做法是将国家重新排序为正确的顺序,然后过滤它们,或者在谓词过滤它们之后简单地对它们进行排序。您还可以向国家/地区添加订单字段,然后使用 sortedArrayUsingSelector:

请参阅此处的文档:http: //developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Articles/Arrays.html#//apple_ref/doc/uid/20000132-SW5

于 2012-06-19T15:59:08.213 回答
0

我试图避免这种情况,但到目前为止,这是我知道的唯一方法:

NSMutableArray *filteredCountries = [[[NSMutableArray alloc] init] autorelease];
NSArray *countryNames = ... // list of country names. this order matters
NSArray *countries = ...    // array of country objects
for (NSString *name in countryNames) {
    for (NSDictionary *dict in countries) {
        if ([[dict objectForKey:@"name"] isEqualToString:name]) {
            [filteredCountries addObject:dict];
        }
    }
}

它很糟糕,但它会发货。仍然欢迎更好、更优雅的解决方案。

于 2012-06-19T16:56:53.637 回答