【问题标题】:sortedArrayUsingComparator returning incorrect resultssortedArrayUsingComparator 返回不正确的结果
【发布时间】:2014-06-22 06:02:38
【问题描述】:

我有一个数组,其中包含一组时间戳(作为字符串),并且它们按排序顺序排列。我只想再次对它们进行排序,看看是否返回了相同的列表(原因是我将处理乱序存储的进一步时间戳,并且需要对它们进行排序)。这是我的日期数组,其中时间戳基本上是字符串:

(
"Jun 18, 2014 12:00:00 AM",
"Jun 18, 2014 12:15:00 AM",
"Jun 18, 2014 12:30:00 AM",
"Jun 18, 2014 12:45:00 AM",
"Jun 18, 2014 1:00:00 AM",
"Jun 18, 2014 1:15:00 AM",
"Jun 18, 2014 1:30:00 AM",
"Jun 18, 2014 1:45:00 AM",
"Jun 18, 2014 2:00:00 AM",
"Jun 18, 2014 2:15:00 AM",
"Jun 18, 2014 2:30:00 AM",
"Jun 18, 2014 2:45:00 AM",
"Jun 18, 2014 3:00:00 AM",
"Jun 18, 2014 3:15:00 AM",
"Jun 18, 2014 3:30:00 AM",
"Jun 18, 2014 4:15:00 AM",
"Jun 18, 2014 4:30:00 AM",
"Jun 18, 2014 4:45:00 AM",
"Jun 18, 2014 5:15:00 AM",
"Jun 18, 2014 5:30:00 AM",
"Jun 18, 2014 5:45:00 AM",
"Jun 18, 2014 6:00:00 AM",
"Jun 18, 2014 6:15:00 AM",
"Jun 18, 2014 6:30:00 AM",
"Jun 18, 2014 6:45:00 AM",
"Jun 18, 2014 7:00:00 AM",
"Jun 18, 2014 7:15:00 AM",
"Jun 18, 2014 7:30:00 AM",
"Jun 18, 2014 7:45:00 AM",
"Jun 18, 2014 8:00:00 AM",
"Jun 18, 2014 8:15:00 AM",
"Jun 18, 2014 8:30:00 AM",
"Jun 18, 2014 8:45:00 AM",
"Jun 18, 2014 9:00:00 AM",
"Jun 18, 2014 9:15:00 AM",
"Jun 18, 2014 10:00:00 AM",
"Jun 18, 2014 10:15:00 AM",
"Jun 18, 2014 10:30:00 AM",
"Jun 18, 2014 10:45:00 AM",
"Jun 18, 2014 11:15:00 AM",
"Jun 18, 2014 11:30:00 AM",
"Jun 18, 2014 11:45:00 AM",
"Jun 18, 2014 12:00:00 PM",
"Jun 18, 2014 12:15:00 PM",
"Jun 18, 2014 12:30:00 PM",
"Jun 18, 2014 12:45:00 PM",
"Jun 18, 2014 1:00:00 PM",
"Jun 18, 2014 1:15:00 PM",
"Jun 18, 2014 1:30:00 PM",
"Jun 18, 2014 2:00:00 PM",
"Jun 18, 2014 2:15:00 PM",
"Jun 18, 2014 2:30:00 PM",
"Jun 18, 2014 2:45:00 PM",
"Jun 18, 2014 3:00:00 PM",
"Jun 18, 2014 3:15:00 PM",
"Jun 18, 2014 3:45:00 PM",
"Jun 18, 2014 4:00:00 PM",
"Jun 18, 2014 4:15:00 PM",
"Jun 18, 2014 4:45:00 PM",
"Jun 18, 2014 5:15:00 PM",
"Jun 18, 2014 5:30:00 PM",
"Jun 18, 2014 6:00:00 PM",
"Jun 18, 2014 6:15:00 PM",
"Jun 18, 2014 7:00:00 PM",
"Jun 18, 2014 7:15:00 PM",
"Jun 18, 2014 7:30:00 PM",
"Jun 18, 2014 8:00:00 PM",
"Jun 18, 2014 8:15:00 PM",
"Jun 18, 2014 8:30:00 PM",
"Jun 18, 2014 9:15:00 PM",
"Jun 18, 2014 9:30:00 PM",
"Jun 18, 2014 9:45:00 PM",
"Jun 18, 2014 10:15:00 PM",
"Jun 18, 2014 10:30:00 PM",
"Jun 18, 2014 11:15:00 PM",
"Jun 18, 2014 11:30:00 PM",
"Jun 18, 2014 11:45:00 PM"
)

上面的数组是排序的时间戳。现在,如果我按升序对它们重新排序,它们应该给我相同的结果,但我想得到的结果是乱序的。我只是不明白为什么我会看到这样的行为: 这是我得到的输出:

sorted dates = (
"Jun 18, 2014 12:00:00 AM",
"Jun 18, 2014 1:00:00 AM",
"Jun 18, 2014 2:00:00 AM",
"Jun 18, 2014 3:00:00 AM",
"Jun 18, 2014 6:00:00 AM",
"Jun 18, 2014 7:00:00 AM",
"Jun 18, 2014 8:00:00 AM",
"Jun 18, 2014 9:00:00 AM",
"Jun 18, 2014 10:00:00 AM",
"Jun 18, 2014 12:15:00 AM",
"Jun 18, 2014 1:15:00 AM",
"Jun 18, 2014 2:15:00 AM",
"Jun 18, 2014 3:15:00 AM",
"Jun 18, 2014 4:15:00 AM",
"Jun 18, 2014 5:15:00 AM",
"Jun 18, 2014 6:15:00 AM",
"Jun 18, 2014 7:15:00 AM",
"Jun 18, 2014 8:15:00 AM",
"Jun 18, 2014 9:15:00 AM",
"Jun 18, 2014 10:15:00 AM",
"Jun 18, 2014 11:15:00 AM",
"Jun 18, 2014 12:30:00 AM",
"Jun 18, 2014 1:30:00 AM",
"Jun 18, 2014 2:30:00 AM",
"Jun 18, 2014 3:30:00 AM",
"Jun 18, 2014 4:30:00 AM",
"Jun 18, 2014 5:30:00 AM",
"Jun 18, 2014 6:30:00 AM",
"Jun 18, 2014 7:30:00 AM",
"Jun 18, 2014 8:30:00 AM",
"Jun 18, 2014 10:30:00 AM",
"Jun 18, 2014 11:30:00 AM",
"Jun 18, 2014 12:45:00 AM",
"Jun 18, 2014 1:45:00 AM",
"Jun 18, 2014 2:45:00 AM",
"Jun 18, 2014 4:45:00 AM",
"Jun 18, 2014 5:45:00 AM",
"Jun 18, 2014 6:45:00 AM",
"Jun 18, 2014 7:45:00 AM",
"Jun 18, 2014 8:45:00 AM",
"Jun 18, 2014 10:45:00 AM",
"Jun 18, 2014 11:45:00 AM",
"Jun 18, 2014 12:00:00 PM",
"Jun 18, 2014 1:00:00 PM",
"Jun 18, 2014 2:00:00 PM",
"Jun 18, 2014 3:00:00 PM",
"Jun 18, 2014 4:00:00 PM",
"Jun 18, 2014 6:00:00 PM",
"Jun 18, 2014 7:00:00 PM",
"Jun 18, 2014 8:00:00 PM",
"Jun 18, 2014 12:15:00 PM",
"Jun 18, 2014 1:15:00 PM",
"Jun 18, 2014 2:15:00 PM",
"Jun 18, 2014 3:15:00 PM",
"Jun 18, 2014 4:15:00 PM",
"Jun 18, 2014 5:15:00 PM",
"Jun 18, 2014 6:15:00 PM",
"Jun 18, 2014 7:15:00 PM",
"Jun 18, 2014 8:15:00 PM",
"Jun 18, 2014 9:15:00 PM",
"Jun 18, 2014 10:15:00 PM",
"Jun 18, 2014 11:15:00 PM",
"Jun 18, 2014 12:30:00 PM",
"Jun 18, 2014 1:30:00 PM",
"Jun 18, 2014 2:30:00 PM",
"Jun 18, 2014 5:30:00 PM",
"Jun 18, 2014 7:30:00 PM",
"Jun 18, 2014 8:30:00 PM",
"Jun 18, 2014 9:30:00 PM",
"Jun 18, 2014 10:30:00 PM",
"Jun 18, 2014 11:30:00 PM",
"Jun 18, 2014 12:45:00 PM",
"Jun 18, 2014 2:45:00 PM",
"Jun 18, 2014 3:45:00 PM",
"Jun 18, 2014 4:45:00 PM",
"Jun 18, 2014 9:45:00 PM",
"Jun 18, 2014 11:45:00 PM"
)

例如,为什么“2014 年 6 月 18 日上午 12:15:00”会显示在“2014 年 6 月 18 日上午 1:00:00”之后?我只是不明白这部分!

这是我的代码:

-(void)sortDates {
NSDateFormatter *dateFormatter;

dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMM dd, yyyy HH:mm:ss a"];

NSLog(@"%@", xAxisDataWithDate);
NSArray *sortedTimes = [xAxisDataWithDate sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2)
{
    NSDate *date1 = [dateFormatter dateFromString:obj1];
    NSDate *date2 = [dateFormatter dateFromString:obj2];
    return [date1 compare:date2];
}];
NSLog(@"sorted dates = %@", sortedTimes);
}

我还编写了一个示例程序,其中包含这些日期的子集,当数组中存在 1:00:00 AM 时,它似乎给了我错误的结果(1:00:00 AM 应该在 12 之后存储: 00:00 AM):

-(void)sortDates {
NSDateFormatter *dateFormatter;

dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MMM dd, yyyy HH:mm:ss a"];

NSMutableArray *times = [[NSMutableArray alloc]initWithObjects:@"Jun 19, 2014 11:45:00 PM", @"Jun 18, 2014 1:00:00 AM", @"Jun 18, 2014 12:15:00 AM",@"Jun 18, 2014 12:00:00 AM", nil];
NSArray *sortedTimes = [times sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2)
{
    NSDate *date1 = [dateFormatter dateFromString:obj1];
    NSDate *date2 = [dateFormatter dateFromString:obj2];
    return [date1 compare:date2];
}];
NSLog(@"sorted dates = %@", sortedTimes);
}

输出:

sorted dates = (
"Jun 18, 2014 1:00:00 AM",
"Jun 18, 2014 12:00:00 AM",
"Jun 18, 2014 12:15:00 AM",
"Jun 19, 2014 11:45:00 PM"
)

我无法弄清楚为什么我的结果与 NSMutableArray *xAxisDataWithDate 和 w.r.t NSMutableArray *times 不一致!请在这方面帮助我!赞赏。

【问题讨论】:

  • 你应该使用“hh”来表示小时,因为你在上午/下午使用 1-12。 “HH”代表 0-23。此外,请务必将日期格式的语言环境设置为某些标准语言环境(可能是[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]),而不是让它选择系统语言环境,因为这会有所不同。综上所述,您可能应该使用日期对象而不是字符串开头。
  • 另外,尝试记录您的格式化程序为两个字符串提供的NSDate 对象,这些字符串最终相对于彼此排序不正确。看看它是如何解释这些字符串的。
  • 谢谢肯。这对我有用!非常感谢您的帮助。

标签: ios iphone objective-c nsdate nsdateformatter


【解决方案1】:

您的格式似乎错误,时间似乎是 12 小时格式,请将格式更改为 MMM dd, yyyy hh:mm:ss a note lowercase "h"

"Jun 18, 2014 12:00:00 AM",
"Jun 18, 2014 12:15:00 AM",
"Jun 18, 2014 1:00:00 AM",
"Jun 19, 2014 11:45:00 PM"

更重要的是,您应该在比较之前将字符串转换为日期,sortedArray… 使用合并排序,因此您将字符串转换为日期n log n 次而不是n

【讨论】:

    猜你喜欢
    • 2012-04-11
    • 2016-02-06
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2014-11-03
    • 2021-10-07
    相关资源
    最近更新 更多