在Objective-C中替代NSCountedSet以保持顺序

时间:2016-07-06 18:45:18

标签: ios objective-c nsarray nscountedset

下面的代码完成了我需要的东西,但事后没有订购。(请不要告诉我,因为NSSet是无序的,我知道。)这不是一个重复的SO问题我或者花了超过40分钟阅读所有“类似”的问题,他们不解决问题。

我正在尝试获取“每小时”,“每日”,“每月”视图,其中“事件”在给定时间段内发生的次数标记图表的x轴上的时间或日期,并标记它在y轴上发生的次数。它可以通过简单地按升序排列下面的dictArray,这取决于我如何格式化要显示的字符串。但问题就是这个问题。对于每小时视图,我正在格式化“datesForEvent”数组中的字符串,如此[早上7点,早上7点,早上7点,上午8点,上午8点,上午11点,上午11点,下午1点,下午1点,下午3点,下午3点],所以当我将其排序为NSCountedSet它将在我的图表的x轴上显示它,如下午1点,下午3点,早上7点,早上8点,上午11点。显然不好。如果我将我的格式化字符串放入“datesForEvent”数组作为日常视图,如[sun,sun,sun,mon,mon,tue,wed,wed,wed,wed,thu,thu,fri,fri fri,fri]它将在x轴fri,mon,sat,sun,thu,tue,wed上按照这样排序。同样的事情发生在月份视图“Jul”将出现在“Jun”之前。

这完全合理,但我不知道如何解决这个问题。这个问题绝对是由我在计算字符串之前格式化字符串引起的。但是,在计数之后格式化字符串会丢弃在给定时间段内发生某些事情的次数,因为日期格式对于所有事件都是相同的长度,因此它将所有这些事件作为单个事件而不是作为分组事件,因为它们的精确时间精确到毫秒。换句话说,没有事件会有重复的时间,这也是不好的。我在Apple文档中得到了日期格式,日期组件,日期样式等的屁股,但没有用。我正在阅读Predicates指南,同时希望获得任何类型的帮助。推动正确的方向将是非常值得欣赏的。

以下是有问题的代码。具有讽刺意味的是,代码是无错误的,因为它正在做我要求它做的事情。我需要NSCountedSet在没有无序部分的情况下的功能。

NSCountedSet *countedSet = [[NSCountedSet alloc] initWithArray:self.datesForEvent];

NSMutableArray *groupedArray = [NSMutableArray array];
[countedSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {

    [groupedArray addObject:@{@"dates": obj,
                           @"count": @([countedSet countForObject:obj])}];

}];

//This sorting will sort alphabetically so its not good.   
NSArray *orderedArray = [[NSArray alloc]initWithArray:[groupedArray sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"dates" ascending:YES]]]];

以下是来自@CRD的评论排序的更新。我从其他工作中快速休息了一下,并提出了这个解决方案,以正确的顺序计算日期,这与不保持顺序的NSOrderedSet解决方案不同。但是,由于缺乏一个更好的词,我会喜欢你对它的稳健性或强度的看法。我觉得在数组末尾坚持[NSNull null]有点hacky?

 #import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) NSArray *baseArray;
@property (nonatomic, strong) NSMutableArray *datesArray;
@property (nonatomic, strong) NSMutableArray *countArray;


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //Base Array of counts should be - 07/1 (4), 7/2 (3), 7/3 (2), 7/4 (1)
    self.baseArray = @[@"07/01/16",@"07/01/16",@"07/01/16",@"07/01/16",
                       @"07/02/16",@"07/02/16",@"07/02/16",
                       @"07/03/16",@"07/03/16",
                       @"07/04/16"];

    self.datesArray = [[NSMutableArray alloc]init];

    [self.datesArray addObjectsFromArray:self.baseArray];
    [self.datesArray addObject:[NSNull null]];

    self.countArray = [[NSMutableArray alloc]init];

    int marker = 0;
    int counter = 0;

    //For loop for count of elements
for (int i = 0; i < self.datesArray.count; i++) {

    if (self.datesArray[marker] == self.datesArray[i]) {

        counter++;
        NSLog(@"MDate %@ Index %@ Counter: %d Marker: %d", self.datesArray[marker], self.datesArray[i], counter, marker);

    } else if (self.datesArray[marker] != self.datesArray[i]){

        [self.countArray addObject:[NSNumber numberWithInt:counter]];
        NSLog(@"Count is: %d", counter);

        marker = i;
        --i;
        counter = 0;
    } 
}
    NSLog(@"Count Array is: %@", self.countArray);
}

  @end

1 个答案:

答案 0 :(得分:0)

这就是我最终选择的。

  $scope.gridOptions = {
    enableSorting: true,
    data:'myData',
    columnDefs: [
      { field: 'sv_name', displayName: 'Nombre'},
      {field: 'sv_code', displayName: 'Placa'},
      { field: 'count', displayName: 'Cuenta',
        cellClass: function(grid, row, col, rowRenderIndex, colRenderIndex) {
          if (grid.getCellValue(row,col) == 1) {
            return 'blue';
          }
          return 'green';
        }
      }
    ]
  };