1

セットアップ:UITableView名前、通り、州などで米国のゴルフ コースを表示 する を用意します。UITableView'sデータ ソースは、 というクラスNSMutableArrayのオブジェクトです。GolfCourseallGolfCourses

からすべての西海岸のゴルフ コースを削除し、allGolfCourses新しい. 私は西海岸のすべての州(略語)と呼ばれる別のものを持っていますが、これら2つを接続するのに苦労しています.arrayeastCoastGolfCoursesNSArraystring objectswestCoastStates

allGolfCourses を繰り返し処理し、 westCoastStates配列で見つかった状態 Abbreviations を持つすべてのオブジェクトを削除するにはどうすればよいですか?

westCoastStates 配列:

self.westCoastStates = [NSMutableArray arrayWithObjects:
                        @"CH",
                        @"OR",
                        @"WA",
                        nil];

ゴルフコース.h

@interface GolfCourse : NSObject

@property (nonatomic, strong) NSString *longitude;
@property (nonatomic, strong) NSString *latitude;
@property (nonatomic, strong) NSString *clubName;
@property (nonatomic, strong) NSString *state;
@property (nonatomic, strong) NSString *courseInfo;
@property (nonatomic, strong) NSString *street;
@property (nonatomic, strong) NSString *city;
@property (nonatomic, strong) NSString *clubID;
@property (nonatomic, strong) NSString *phone;

@end

注: NSString *state; 州の略語が含まれます。例: FL

単一の引数でこれを行う方法は知っていますが、配列のすべての文字列をチェックする方法がわかりませんwestCoastStates。お役に立てれば幸いです。

4

3 に答える 3

3

どうですか?

NSSet* westCoastStatesSet = [NSSet setWithArray:self.westCoastStates];
NSIndexSet* eastCoastGolfCoursesIndexSet = [allGolfCourses indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    GolfCourse* course = (GolfCourse*)obj;
    if ([westCoastStatesSet containsObject:course.state]) {
        return NO;
    }
    return YES;
}];

NSArray* eastCoastGolfCourses = [allGolfCourses objectsAtIndexes:eastCoastGolfCoursesIndexSet];

更新:これは述語の使用で凝縮できると思います

NSPredicate *inPredicate = [NSPredicate predicateWithFormat: @"!(state IN %@)", self.westCoastStates];
NSArray* eastCoastGolfCourses = [allGolfCourses filteredArrayUsingPredicate:inPredicate];
于 2012-11-04T15:48:21.563 に答える
0

擬似コード:

for (int i = 0; i < allGolfCourses.length;) {
    Course* course = [allGolfCourses objectAtIndex:i];
    if (<is course in one of the "bad" states?>) {
       [allGolfCourse removeObjectAtIndex:i];
    }
    else {
        i++;
    }
}
于 2012-11-04T15:41:59.247 に答える
0

次のように、配列をすばやく反復できます。

[self.allGolfCourses enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    GolfCourse *currentGolfCourse = (GolfCourse *)obj;
    if(![self.westCoastStates containsObject:currentGolfCourse.state]){
        [self.eastCoastStates addObject:currentGolfCourse];
    }
}];
于 2012-11-04T15:54:47.080 に答える