Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何仅使用要搜索的行的一部分从NSArray中的行获取数据_Ios_Objective C_Nsmutablearray - Fatal编程技术网

Ios 如何仅使用要搜索的行的一部分从NSArray中的行获取数据

Ios 如何仅使用要搜索的行的一部分从NSArray中的行获取数据,ios,objective-c,nsmutablearray,Ios,Objective C,Nsmutablearray,假设我有一个填充了几行的数组 dates = [NSArray arrayWithObjects:@"2012-05-01||Blue", @"2012-05-02||Red", @"2012-05-03||Green", @"2012-05-04||Orange", @"2012-05-05||Yellow", @"2012-05-06||Purple", @"2012-05-07||Silver", nil]; 然后我要在2012年5月1日之前搜索一个日期 我如何只搜索一个对象的一部分而不

假设我有一个填充了几行的数组

dates = [NSArray arrayWithObjects:@"2012-05-01||Blue", @"2012-05-02||Red", @"2012-05-03||Green", @"2012-05-04||Orange", @"2012-05-05||Yellow", @"2012-05-06||Purple", @"2012-05-07||Silver", nil];
然后我要在2012年5月1日之前搜索一个日期

我如何只搜索一个对象的一部分而不进行大的for循环,因为这个数组理论上可以容纳几千个单元格

编辑:

如有必要,如何将数据加载到NSDictionary中?我从来没用过

我知道我可以像这样得到数据

for(NSString *row in dates) {
NSString *date = [[row componentsSeperatedByString:@"||"] objectAtIndex:0];
NSString *color = [[row componentsSeperatedByString:@"||"] objectAtIndex:1];
}
如果我是正确的,这会将其格式化为NSDictionary,然后我可以使用以下方法获取颜色:

NSString *dateToFind = @"2012-05-01";
NSDate *date = [dateFormatter dateFromString:dateToFind];
NSString *theColor = [colorsAndDates objectForKey:date];

知道了这一点,我必须回去,让它围绕NSDictionary而不是它们所在的字符串旋转。

除了在数组中循环之外,您还可以做一些事情:

1使用排序数组。即使您需要保持数据的初始顺序,也可以对其进行排序。然后,如果有n个项目,您可以进行二进制搜索,检查n/2项目,如果它小于您的日期,则只使用n/2到n的数据重复该过程,如果它大于n/2,则使用0到n/2的数据重复该过程。分类一次,发现很多

2使用数据动态创建字典。可以使用数据的10个字符前缀作为键。您必须维护字典和数组,因此如果有很多更改,这可能不可行。创建字典一次,找到很多。注意:尽管您得到了答案,但字典可能不是最好的解决方案,特别是如果您没有唯一的键,即多条记录具有相同的日期

3忘记数组并将数据存储在sqlite中,然后编写sql语句来获取它。如果你有大量的数据,这是最有用的。如果数据中有重复的日期,可以使用sqlite生成主键。

创建字典:

NSDictionary *dateDictionary = @{
                                 @"2012-05-01" : @"Blue",
                                 @"2012-05-02" : @"Red",
                                 @"2012-05-03" : @"Green",
                                 @"2012-05-04" : @"Orange",
                                 @"2012-05-05" : @"Yellow",
                                 @"2012-05-06" : @"Purple",
                                 @"2012-05-07" : @"Silver"
                                 };

NSString *date = @"2012-05-01";
NSString *dateColor = dateDictionary[date];
NSMutableDictionary *dateDictionary = [NSMutableDictionary dictionary];
for(NSString *row in dates) {
    NSString *date = [[row componentsSeperatedByString:@"||"] objectAtIndex:0];
    NSString *color = [[row componentsSeperatedByString:@"||"] objectAtIndex:1];

    dateDictionary[date] = color;
}

NSString *date = @"2012-05-01";
NSString *dateColor = dateDictionary[date];
使用您给出的通过数组循环创建字典的示例:

NSDictionary *dateDictionary = @{
                                 @"2012-05-01" : @"Blue",
                                 @"2012-05-02" : @"Red",
                                 @"2012-05-03" : @"Green",
                                 @"2012-05-04" : @"Orange",
                                 @"2012-05-05" : @"Yellow",
                                 @"2012-05-06" : @"Purple",
                                 @"2012-05-07" : @"Silver"
                                 };

NSString *date = @"2012-05-01";
NSString *dateColor = dateDictionary[date];
NSMutableDictionary *dateDictionary = [NSMutableDictionary dictionary];
for(NSString *row in dates) {
    NSString *date = [[row componentsSeperatedByString:@"||"] objectAtIndex:0];
    NSString *color = [[row componentsSeperatedByString:@"||"] objectAtIndex:1];

    dateDictionary[date] = color;
}

NSString *date = @"2012-05-01";
NSString *dateColor = dateDictionary[date];

我认为你没有根据自己的需要使用合适的课程。你可能应该使用NSDictionary并使用日期作为键。是的,我同意你的观点,但我的问题是整个应用程序都集成到了这些字符串中。我想如果我能将所有这些对象加载到NSDictionary搜索中会容易得多。这是另一个危险信号:将日期存储为字符串!NSArray中的行是指向对象的指针。您不能搜索指针的一部分。如果您害怕使用NSDictionary,那么您根本不应该使用Objective-C编程。如果您有哈希冲突,挂起每个键的列表可能比挂起一个大列表要好。@JoshCaswell是的,但这需要一些额外的编程才能正常工作。sqlite将允许他存储大量数据,如果他使用排序主键,则可以处理重复数据,并快速准确地找到数据。他只需要为它编写一点SQL;我的评论只针对注释结尾的第2项,而不是您使用SQL的建议。注意:在从日期格式化程序获取NSDate之前,您不需要也不应该创建NSDate。它被扔掉了。如果你打算否决一个答案,请至少留下一条解释原因的评论。据我所知,这直接回答了一个问题:如何将数据加载到NSDictionary中?我从来没用过。