【问题标题】:How can I find the one element in an NSArray greater than a certain value? [closed]如何找到 NSArray 中大于某个值的元素? [关闭]
【发布时间】:2012-08-08 14:27:18
【问题描述】:

我刚开始做 iOS 开发。我有一个如下数组:

NSMutableArray *array = [[NSMutableArray alloc] init]; 

[array addObject:[NSNumber numberWithInt:15:00]];
[array addObject:[NSNumber numberWithInt:20:05]];
[array addObject:[NSNumber numberWithInt:1:20]];
[array addObject:[NSNumber numberWithInt:3:40]];

我需要一个标签来显示哪个数组对象是下一个大于我当前时间的对象。例如,如果我现在的时间是:2:00,我的标签应该只显示下一个更大的数字,3:40。没有比这更大的数字。

如何识别这一更大的元素?

【问题讨论】:

  • 请在您的问题中包含您的真实代码。这段代码不仅无效,而且没有任何意义——20:05 不是整数。

标签: objective-c ios date time


【解决方案1】:

首先,您为什么要将NSNumbers 添加到您的NSArray?这些应该是NSDate 对象。

如果你这样做,你可以像这样使用 NSDate 的比较方法:

[date1 compare: date2];

在您的情况下,如果您想在当前时间之后立即显示时间,我会这样做:

NSDate *currentTime = [NSDate dateWithTimeIntervalSinceNow:0];
NSUInteger smallestInterval = -1;
NSInteger smallestDateIndex = -1;

for(int i = 0; i < array.count; i++){
    if([currentTime timeIntervalSinceDate:[array objectAtIndex:i]] <= 0){
    continue;
    }

    if(smallestDateIndex == -1){
        smallestDateIndex = i;
        smallestInterval = [currentTime timeIntervalSinceDate:[array objectAtIndex:i]];
    } else if([currentTime timeIntervalSinceDate:[array objectAtIndex:i]] < smallestInterval){
    smallestInterval = [currentTime timeIntervalSinceDate:[array objectAtIndex:i]];
    smallestDateIndex = i;
    }
}

if(smallestDateIndex > -1){
    NSDateFormatter *formatter = [[NSDateFormatter alloc] initWithDateFormat:@"HH:mm"];
    myLabel.text = [formatter stringFromDate:[array objectAtIndex:smallestDateIndex]];
}

【讨论】:

  • 谢谢。请你写一个小例子。非常感谢。
  • 他只是给你举了一个例子。查看NSDateNSDateFormatter 的文档。
  • 我添加了一个示例,但如果您希望在 iOS 开发中取得任何进展,那么您真的应该自己研究这些东西。应将 70-80% 的开发时间用于通过文档和搜索来研究和规划最佳解决方案。
【解决方案2】:

首先,您必须了解 15:00 不是 int。

使用NSDate,而不是NSNumber

【讨论】:

    【解决方案3】:

    您可以在表格中显示四次。

    代码如下:

    array = [NSMutableArray array];
    NSDate *date;
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSString *s = @"HH:mm";
    dateFormatter.dateFormat = s;
    
    date = [dateFormatter dateFromString:@"15:00"];
    [array addObject:date];
    
    date = [dateFormatter dateFromString:@"20:05"];
    [array addObject:date];
    
    date = [dateFormatter dateFromString:@"1:20"];
    [array addObject:date];
    
    date = [dateFormatter dateFromString:@"3:40"];
    [array addObject:date];
    

    要比较日期,可以使用 NSDate 类的 campare 方法。

    NSComparisonResult result = [dt1 compare:dt];
    switch(result)
    {
    case NSOrderedAscending:
        // dt is bigger than dt1
        break;
    case NSOrderedDescending:
        // dt is smaller than dt1
        break;
    case NSOrderedSame:
        // dt is same with dt1
        break;
    }
    

    您可以从 GitHub 下载项目并运行它。

    https://github.com/weed/p120812_NSDateSumple

    【讨论】:

    • 好的,谢谢。但是 NSLog 怎么能告诉我哪个时间 (@"15:00"; @"20:05"; @"1:20"; @"3:40";) 大于我的当前。我需要 NSLog 来显示我刚刚比我当前时间大的第一个。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多