在保留顺序的同时,从另一个NSArray中的值过滤NSDrray的NSDrray

时间:2012-06-19 15:52:59

标签: iphone objective-c ios nsarray

我有两个阵列。

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

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中没有的国家/地区。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

字典是无序集合。它没有订单。您应该在数组中维护键,这些键将维护顺序,然后使用数组对象进行排序。请查看this link以供参考。

感谢。

答案 2 :(得分: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];
        }
    }
}

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