前段時(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ù)耘柱,如果哪位朋友知道,望告知棍现,不勝感激调煎。