Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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
Objective c 在已排序的NSArray中查找NSDate_Objective C_Nsarray - Fatal编程技术网

Objective c 在已排序的NSArray中查找NSDate

Objective c 在已排序的NSArray中查找NSDate,objective-c,nsarray,Objective C,Nsarray,我有一个NSDate对象的排序数组。我想做的是创建一个方法,该方法接受一个日期,并根据该日期是否可以在日期数组中找到而返回YES或NO NSArray *dateArray; -(BOOL)arrayContainsDate(NSDate *)d { // return YES if d is found in dateArray } 我知道如何一个接一个地检查数组的每个元素,但我需要一种更快的方法。当数组排序时,请使用。首先将日期与数组的中间元素进行比较(使用compare:)-如果它

我有一个NSDate对象的排序数组。我想做的是创建一个方法,该方法接受一个日期,并根据该日期是否可以在日期数组中找到而返回YES或NO

NSArray *dateArray;

-(BOOL)arrayContainsDate(NSDate *)d {
  // return YES if d is found in dateArray
}

我知道如何一个接一个地检查数组的每个元素,但我需要一种更快的方法。

当数组排序时,请使用。首先将日期与数组的中间元素进行比较(使用
compare:
)-如果它相等,则找到它。如果小于或大于,则仅考虑阵列的前半部分或后半部分,重复此操作。等等

您可以通过使用两个索引来实现这一点—您正在考虑的范围的最小值和最大值。计算中间指数,进行比较,然后将新的范围考虑为min,中-1或中+ 1,最大值

这个算法是O(log2n)-你不会做得更好

代码留作练习


HTH

在对数组进行排序时使用。首先将日期与数组的中间元素进行比较(使用
compare:
)-如果它相等,则找到它。如果小于或大于,则仅考虑阵列的前半部分或后半部分,重复此操作。等等

您可以通过使用两个索引来实现这一点—您正在考虑的范围的最小值和最大值。计算中间指数,进行比较,然后将新的范围考虑为min,中-1或中+ 1,最大值

这个算法是O(log2n)-你不会做得更好

代码留作练习

HTH

您可以使用散列

NSDictionary *dict = {[NSString stringWithFormat:@"%@",date1]:@"",[NSString stringWithFormat:@"%@",date2]:@""}

- (BOOL) containsDate:(NSDate*)_d
{
   return [dict valueForKey:[NSString stringWithFormat:@"%@",_d]] != nil;
}
您可以使用散列

NSDictionary *dict = {[NSString stringWithFormat:@"%@",date1]:@"",[NSString stringWithFormat:@"%@",date2]:@""}

- (BOOL) containsDate:(NSDate*)_d
{
   return [dict valueForKey:[NSString stringWithFormat:@"%@",_d]] != nil;
}

当确定一个对象是否存在于一组对象中时,考虑使用A/Objor(或者/如果您正在为Mac OS X 10.7或IOS 5开发,并希望保留集合中的元素顺序)。一个
NSSet
容器是为高效查找而设计的。当一个对象有一个像样的<代码>散列< /代码>(大多数基础对象都这样做)时,查找是有效的O(1),它比二进制搜索快。p>
NSSet *dateSet = [NSSet setWithArray:dateArray];

if ([dateSet containsObject:date1])
{
    // do something
}
请注意,重要的是构造一次集合,而不是每次都从数组转换集合,否则将失去任何性能优势

有关详细信息,请参阅


由于要检查指定的日期而不考虑时间,因此需要在将日期值添加到集合之前截断日期值。例如(选择更好的名称,这只是一个示例):


当确定一个对象是否存在于一组对象中时,考虑使用A/Objor(或者/如果您正在为Mac OS X 10.7或IOS 5开发,并希望保留集合中的元素顺序)。一个
NSSet
容器是为高效查找而设计的。当一个对象有一个像样的<代码>散列< /代码>(大多数基础对象都这样做)时,查找是有效的O(1),它比二进制搜索快。p>
NSSet *dateSet = [NSSet setWithArray:dateArray];

if ([dateSet containsObject:date1])
{
    // do something
}
请注意,重要的是构造一次集合,而不是每次都从数组转换集合,否则将失去任何性能优势

有关详细信息,请参阅


由于要检查指定的日期而不考虑时间,因此需要在将日期值添加到集合之前截断日期值。例如(选择更好的名称,这只是一个示例):


[dateArray containsObject:d]
的问题可能重复?@JoshCaswell:当有更快的解决方案可用时,它是O(n)(这可能会根据
dateArray
的大小产生明显的差异)。此外,在我的情况下,它不是相同的日期对象。我想查看我搜索股票的日期是否与数组中的任何日期仅在同一天/月/年。@ChoppinBroccoli说,它不必共享相同的时间,最好在问题的主体中包含这样的重要信息。这改变了很多。可能重复了
[dateArray containsObject:d]
的错误吗?@JoshCaswell:如果有更快的解决方案可用(这可能会根据
dateArray
的大小产生明显的差异),那么它就是O(n)。而且,在我的情况下,它不是同一个日期对象。我想查看我搜索股票的日期是否与数组中的任何日期仅在同一天/月/年。@ChoppinBroccoli说,它不必共享相同的时间,最好在问题的主体中包含这样的重要信息。这改变了很多。谢谢你的帮助。有人能提供一些代码吗?谢谢@dasblinkenlight——我想悲叹教育系统的状况可能不合适;-)@如果你觉得你真的需要代码,你可能应该去学习一些基本的东西。首先将
minIndex
设置为
0
,将
maxIndex
设置为
dateArray.length-1
——覆盖所有元素。现在计算
midIndex
作为
minIndex
maxIndex
之间的中点。现在
比较:
d
dataArray
midIndex
元素。返回三个值中的一个-使用
开关
。对于已完成的比赛案例,对于其他两个,根据需要调整
minIndex
maxIndex
,然后重复。@CRD继续,这样你几乎永远不知道谁在另一端:可能是一个聪明的12岁小孩,也可能是一个70岁的人,他自己为了好玩而开始编程。目标C听起来特别可疑,因为iOS吸引了很多不同背景的人。@dasblinkenlight-我不认为这是谁在另一端的问题。我更希望基础编程指导(在线、书籍等)已经从如何“我们有一种方法”转变为“我们有一种方法”——这类工作直到没有:-(无论如何,哲学已经够多了。谢谢你的帮助。有人能提供一些代码吗?谢谢!@dasblinkenlight-我想悲叹教育系统的状况可能不合适;-)@choppenbrocoli-如果你觉得你真的需要代码,你可能应该去学习一些基本的东西