【问题标题】:sort elements in NSArray based on timestamp of element in my case在我的情况下,根据元素的时间戳对 NSArray 中的元素进行排序
【发布时间】:2016-09-21 06:19:07
【问题描述】:

我有一个NSString 数组,每个NSString 元素都包含一个时间戳(纪元时间)和其他字符,例如:"time:1474437948687, <other characters>"

NSArrary *myData = [self loadData];// my array 

所以,myData 内部看起来像这样:

{"time:1474437948687,fajlsfj...",
 "time:1474237943221, axsasdfd...",
 "time:1474681430940, someother...",
 ...
}

我需要一个数组,它包含与上述数组相同的元素,但按时间戳的降序排序。我该怎么做?

我在遍历 NSString 数组时遇到了困难:

for (NSString element in myData) {
 ...
}

【问题讨论】:

  • 使用 NSSortDescriptor 根据时间缩短数组。
  • 谢谢,我马上去看看NSSortDescriptor,我之前没用过。
  • 你能显示你的数组吗
  • @Leem.fin pl。检查我的答案我在同一天更新了原始类型的排序..

标签: ios objective-c sorting nsarray


【解决方案1】:

使用以下 sortedArrayUsingComparator 它将对我有用:我使用静态数据,例如 time:1474437948687, ..

**time:1474437948687, <other characters> Consider String Format..**

    NSArrary *myData = [self loadData];
    NSArrary *sortedmyData = [[myData sortedArrayUsingComparator: ^(id obj1, id obj2) {
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        // Change Date formate accordingly ====
        [df setDateFormat:@"dd-MM-yyyy"];
        NSDate *d1 = [df dateFromString:[self sperateDate:obj1]];
        NSDate *d2 = [df dateFromString:[self sperateDate:obj2]];
        return [d1 compare: d2];
    }];

// 这个函数是按照time:1474437948687开发的,考虑字符串格式..

- (NSString *)sperateDate : (NSString *)obj1 {
    NSArray *arr = [obj1 componentsSeparatedByString:@","];
    NSArray *arr1 = [arr[0] componentsSeparatedByString:@":"];
    return arr1[1];
}

更新与原始类型比较:

    NSArray *myData = @[@"time:1474437948687,fajlsfj...",@"time:1474237943221, axsasdfd...",@"time:1474681430940, someother..."
    NSArray *sortedmyData = [myData sortedArrayUsingComparator: ^(id obj1, id obj2) {
    NSNumber *d1 = [NSNumber numberWithDouble:[[self sperateDate:obj1] doubleValue]];
    NSNumber *d2 = [NSNumber numberWithDouble:[[self sperateDate:obj2] doubleValue]];
    return [d1 compare: d2];
    }];

希望对您有所帮助...

如果您有任何其他疑问,请告诉我

【讨论】:

  • 谢谢,我现在试试,结果会告诉你的。
  • 我们可以只使用以毫秒为单位的纪元时间来进行比较而不是转换为 NSDate 吗?
  • 我还在寻找... dateWithTimeIntervalSince1970 将给出 1970 年的毫秒数。两个对象都需要比较两个对象给出的毫秒数。它可能无法解决比较两个日期和排序的目的......
  • 如果您想将纪元转换为带秒数的日期,那么我们可以使用不同的日期格式化程序。例如 [df setDateFormat:@"dd-MM-yyyy H:mm:ss"];
  • 我设法通过转换为 NSNumber 解决了这个问题,并比较了 NSNumber 对象
【解决方案2】:

试试这个:

   NSArray *timearray = @[@"time:1474437948687,fajlsfj...",
        @"time:1474237943221, axsasdfd...",
        @"time:1474681430940, someother..."];
    NSSortDescriptor *sortDescriptor;

    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@""
                                                 ascending:NO];

    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    NSArray *sortedArray = [timearray sortedArrayUsingDescriptors:sortDescriptors];

    NSLog(@"sortedArray %@",sortedArray);

输出:

sortedArray (
        "time:1474681430940, someother...",
        "time:1474437948687,fajlsfj...",
        "time:1474237943221, axsasdfd..."
    )

【讨论】:

    【解决方案3】:

    首先,将字符串转换为以键值方式反映数据的实体类型的实例似乎是一个好主意。然后您可以使用NSSortDescriptor 的实例轻松对其进行排序:

    NSSortDescriptor *timeSorter = [NSSortDescriptor sortDescriptorWithKey:@"time" ascending:NO];
    NSArray *sorted = [myData sortedArrayUsingSortDescriptors:@[timeSorter]];
    

    但是,您可以使用更复杂的排序描述符对数组进行排序:

    NSSortDescriptor *timeSorter = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO comparator:
    ^(id one, id two )
    {
      NSString *timestamp1 = [one compenentsSepartedByString:@","][0];
      timestamp1 = [timestamp1 substringFromIndex:5];
      NSString *timestamp2 = [two compenentsSepartedByString:@","][0];
      timestamp2 = [timestamp2 substringFromIndex:5];
      return [timestamp1 compare:timestamp2 options:NSNumericSearch range:NSMakeRange(0, [timestamp1 length])];
    }];
    NSArray *sorted = [myData sortedArrayUsingSortDescriptors:@[timeSorter]];
    

    在 Safari 中输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      相关资源
      最近更新 更多