我有两个阵列。
第一个数组只是一个国家名称列表,按照特定的顺序排列。
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
中没有的国家/地区。
有什么想法吗?
答案 0 :(得分:0)
国家/地区应该按照发现项目的顺序保留。最简单的方法是将国家/地区重新排序到正确的顺序,然后过滤它们,或者在谓词过滤后对它们进行排序。您还可以向国家/地区添加订单字段,然后使用sortedArrayUsingSelector:
答案 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];
}
}
}
很糟糕,但它发货了。仍然欢迎更好,更优雅的解决方案。