filter篩選數(shù)據(jù)

前段時(shí)間的開發(fā)有個(gè)業(yè)務(wù)場景是:后臺(tái)一次返回全量的題目數(shù)據(jù)(每道題目都有對(duì)應(yīng)的questionID)候味,然后在某個(gè)場景下后臺(tái)返回若干題目的questionID梁厉,需要前臺(tái)自己去緩存好的全量題目數(shù)據(jù)中篩選查找懊渡。不多說冠句,先貼出代碼:

/**
 題目model
 */
@interface QuestionModel : NSObject
@property (nonatomic, copy) NSString *questionId;/**< 題目ID */
@property (nonatomic, copy) NSString *content;/**< 題目內(nèi)容 */
@end

@implementation QuestionModel
- (NSString *)description {
    return [NSString stringWithFormat:@"questionId = %@ content = %@",_questionId ,_content];
}
@end

#import "ViewController.h"
#import "QuestionModel.h"
@interface ViewController ()
@property (nonatomic, copy) NSMutableArray<QuestionModel *> *questionArr;/**< 題目數(shù)據(jù) */
@property (nonatomic, copy) NSArray<NSString *> *selectedQuestionIDArr;/**< 待選出的題目的IDArr */

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    if (!_questionArr) {
        _questionArr = @[].mutableCopy;
    }
    if (!_selectedQuestionIDArr) {
        _selectedQuestionIDArr = @[@"001",@"007",@"006",@"111"];
    }
    NSArray *questionArr = @[@{@"questionId":@"001",
                               @"content":@"下列加粗字的讀音完全正確的一組是"},
                             @{@"questionId":@"002",
                               @"content":@"下列句子中加粗的成語使用正確的一項(xiàng)是"},
                             @{@"questionId":@"003",
                               @"content":@"下列選項(xiàng)中,加粗詞語使用得不恰當(dāng)?shù)氖?},
                             @{@"questionId":@"004",
                               @"content":@"加粗字的注音织咧,完全正確的一項(xiàng)是"},
                             @{@"questionId":@"005",
                               @"content":@"下列詞語中胀葱,加下劃線字的讀音不同的一項(xiàng)是(  )"},
                             @{@"questionId":@"006",
                               @"content":@"以下劃線的關(guān)于“春”字的成語使用不正確的一項(xiàng)是"},
                             @{@"questionId":@"007",
                               @"content":@"選擇加下劃線的字的字義。近種籬邊菊烦感,秋天未著花巡社。"},
                             @{@"questionId":@"008",
                               @"content":@"下面選項(xiàng)中說法正確的一項(xiàng)是"},
                             @{@"questionId":@"009",
                               @"content":@"下面加點(diǎn)字的讀音完全相同的一項(xiàng)是"},
                             @{@"questionId":@"010",
                               @"content":@"加點(diǎn)字的讀音全部正確的一項(xiàng)是"}];
    for (NSDictionary *dic in questionArr) {
        QuestionModel *model = [[QuestionModel alloc] init];
        [model setValuesForKeysWithDictionary:dic];
        [self.questionArr addObject:model];
    }
}

/**
 自己單層循環(huán)遍歷匹配出題目
 特點(diǎn):遍歷次數(shù)最多n次膛堤,匹配出的題目順序是以題庫順序?yàn)闇?zhǔn)(打印題目順序?yàn)?手趣、6、7)
 */
- (NSArray *)normalMatchQuestion {
    __block NSMutableArray *selectedQuestionMulArr = @[].mutableCopy;
    typeof(self) __weak weakSelf = self;
    [self.questionArr enumerateObjectsUsingBlock:^(QuestionModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([weakSelf.selectedQuestionIDArr containsObject:obj.questionId]) {
            [selectedQuestionMulArr addObject:obj];
            if (selectedQuestionMulArr.count == weakSelf.selectedQuestionIDArr.count) {
                *stop = YES;
            }
        }
    }];
    NSLog(@"normalMatchQuestion selectedQuestionMulArr == %@",selectedQuestionMulArr);
    return [NSArray arrayWithArray:selectedQuestionMulArr];
}

/**
 自己雙層嵌套循環(huán)遍歷匹配出題目
 特點(diǎn):遍歷次數(shù)最多m*n次肥荔,匹配出的題目順序是以選題順序?yàn)闇?zhǔn)(打印題目順序?yàn)?绿渣、7、6)
 */
- (NSArray *)normalDoubleTraversalMatchQuestion {
    __block NSMutableArray *selectedQuestionMulArr = @[].mutableCopy;
    typeof(self) __weak weakSelf = self;
    [self.selectedQuestionIDArr enumerateObjectsUsingBlock:^(NSString * _Nonnull questionID, NSUInteger questionIDIdx, BOOL * _Nonnull questionIDStop) {
        [weakSelf.questionArr enumerateObjectsUsingBlock:^(QuestionModel * _Nonnull questionModel, NSUInteger questionModelIdx, BOOL * _Nonnull questionModelStop) {
            if ([questionModel.questionId isEqualToString:questionID]) {
                [selectedQuestionMulArr addObject:questionModel];
                if (questionIDIdx == weakSelf.selectedQuestionIDArr.count - 1) {
                    *questionModelStop = YES;
                }
            }
        }];
    }];
    NSLog(@"normalDoubleTraversalMatchQuestion selectedQuestionMulArr == %@",selectedQuestionMulArr);
    return [NSArray arrayWithArray:selectedQuestionMulArr];
}

/**
 自己利用字典特性兩次單層循環(huán)遍歷匹配出題目
 特點(diǎn):遍歷次數(shù)最多為2n次燕耿,匹配出的題目順序是以選題順序?yàn)闇?zhǔn)(打印題目順序?yàn)?中符、7、6)
 */
- (NSArray *)twiceTraversalmatchQuestion {
    __block NSMutableDictionary *questionDataDic = @{}.mutableCopy;
    for (QuestionModel *questionModel in self.questionArr) {
        [questionDataDic setValue:questionModel forKey:questionModel.questionId];
    }
    
    __block NSMutableArray *selectedQuestionMulArr = @[].mutableCopy;
    [self.selectedQuestionIDArr enumerateObjectsUsingBlock:^(NSString * _Nonnull questionID, NSUInteger questionIDIdx, BOOL * _Nonnull questionIDStop) {
        if ([questionDataDic objectForKey:questionID]) {
            QuestionModel *questionModel = [questionDataDic objectForKey:questionID];
            [selectedQuestionMulArr addObject:questionModel];
        }
    }];
    NSLog(@"twiceTraversalmatchQuestion selectedQuestionMulArr == %@",selectedQuestionMulArr);
    return [NSArray arrayWithArray:selectedQuestionMulArr];
}

/**
 自己利用NSPredicate匹配出題目
 特點(diǎn):匹配出的題目順序是以題庫順序?yàn)闇?zhǔn)(打印題目順序?yàn)?誉帅、7淀散、6)
 */
- (NSArray *)matchQuestion{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"questionId in %@", self.selectedQuestionIDArr];
    NSArray *list = [self.questionArr filteredArrayUsingPredicate:predicate];
    NSLog(@"twiceTraversalmatchQuestion selectedQuestionMulArr == %@",list);
    return list;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//    [self normalMatchQuestion];
//    [self normalDoubleTraversalMatchQuestion];
//    [self twiceTraversalmatchQuestion];
//    [self matchQuestion];
}

@end

比較容易看出,有兩種篩選結(jié)果分別是:
以題庫題目順序(打印題目順序?yàn)?蚜锨、6档插、7);
以選題題目順序(打印題目順序?yàn)?亚再、7郭膛、6)。
其中使用謂詞(謂詞NSPredicate用法)篩選的方法最為簡便氛悬,不過本人鄙陋则剃,不知道用NSPredicate怎么寫可以按照選題題目順序返回?cái)?shù)據(jù)耘柱,如果哪位朋友知道,望告知棍现,不勝感激调煎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市轴咱,隨后出現(xiàn)的幾起案子汛蝙,更是在濱河造成了極大的恐慌,老刑警劉巖朴肺,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窖剑,死亡現(xiàn)場離奇詭異,居然都是意外死亡戈稿,警方通過查閱死者的電腦和手機(jī)西土,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞍盗,“玉大人需了,你說我怎么就攤上這事“慵祝” “怎么了肋乍?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敷存。 經(jīng)常有香客問我墓造,道長,這世上最難降的妖魔是什么锚烦? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任觅闽,我火速辦了婚禮,結(jié)果婚禮上涮俄,老公的妹妹穿的比我還像新娘蛉拙。我一直安慰自己,他們只是感情好彻亲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布孕锄。 她就那樣靜靜地躺著,像睡著了一般苞尝。 火紅的嫁衣襯著肌膚如雪畸肆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天野来,我揣著相機(jī)與錄音恼除,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛豁辉,可吹牛的內(nèi)容都是我干的令野。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼徽级,長吁一口氣:“原來是場噩夢啊……” “哼气破!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起餐抢,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤现使,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后旷痕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碳锈,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年欺抗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了售碳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绞呈,死狀恐怖贸人,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情佃声,我是刑警寧澤艺智,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站圾亏,受9級(jí)特大地震影響十拣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜召嘶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一父晶、第九天 我趴在偏房一處隱蔽的房頂上張望哮缺。 院中可真熱鬧弄跌,春花似錦、人聲如沸尝苇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糠溜。三九已至淳玩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間非竿,已是汗流浹背蜕着。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人承匣。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓蓖乘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親韧骗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嘉抒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,100評(píng)論 1 32
  • 前言:面試筆試都是必考語法知識(shí)點(diǎn)。請(qǐng)認(rèn)真復(fù)習(xí)和深入研究OC袍暴。 目錄:iOS-面試題-OC基礎(chǔ)篇 (1) - (84...
    麥穗0615閱讀 4,256評(píng)論 0 33
  • 1.設(shè)計(jì)模式是什么政模? 你知道哪些設(shè)計(jì)模式岗宣,并簡要敘述?設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)淋样,就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,151評(píng)論 0 12
  • 編寫軟件時(shí),經(jīng)常需要獲取一個(gè)對(duì)象集合绅你,并通過某些已知條件計(jì)算該集合的值馅笙。你需要保留符合某個(gè)條件的對(duì)象,刪除那些不滿...
    小石頭呢閱讀 3,336評(píng)論 0 2
  • 1.設(shè)計(jì)模式是什么芦缰? 你知道哪些設(shè)計(jì)模式,并簡要敘述枫慷? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)让蕾,就是用比較成熟的邏輯去處理某一種類...
    司馬DE晴空閱讀 1,291評(píng)論 0 7