1

2つのアレイがあります。

最初の配列は、非常に特定の順序での単純な国名のリストです。

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

2番目の配列は、国オブジェクトのコレクションです。

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

の順序を維持しながらcountries、配列を使用してフィルタリングする必要があります。countryNamescountryNames

私の最初の試みは正しくフィルタリングされましたが、順序が保持されません:

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

何が起こっているのかというと、国の順序は維持されていると思いますcountryNames

何か案は?

4

3 に答える 3

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

辞書は順序付けられていないコレクションです。順序はありません。順序を維持する配列内のキーを維持してから、配列オブジェクトを使用して並べ替える必要があります。参考のためにこのリンクを見てください。

ありがとう。

于 2012-06-19T16:08:54.767 に答える
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 に答える