以下のコードは、後で注文されないことを除いて、私が必要とすることを行います. 「同様の」質問をすべて読んでも、問題は解決しません。
特定の期間に「イベント」が発生した回数の「時間別」、「日別」、「月別」のビューを取得しようとしています。グラフの x 軸にその時刻または日付をマークし、マークします。 y 軸で発生した回数。表示する文字列のフォーマット方法に応じて、以下の dictArray を昇順で再ソートするだけで正常に機能します。それが問題です。時間ごとのビューでは、「datesForEvent」配列内の文字列を [7am、7am、7am、8am、8am、11am、11am、1pm、1pm、3pm、3pm] のようにフォーマットしています。 NSCountedSet は、午後 1 時、午後 3 時、午前 7 時、午前 8 時、午前 11 時にグラフの x 軸にこのように表示されます。明らかに良くない。フォーマットされた文字列を「datesForEvent」配列に次のような日次ビューとして配置すると、[太陽、太陽、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 ドキュメントで日付形式、日付コンポーネント、日付スタイルなどを調べても無駄です。私は現在、あらゆる種類の助けを期待しながら述語ガイドを読んでいます。正しい方向へのプッシュに大いに感謝します。
以下は問題のあるコードです。皮肉なことに、コードは私が求めていることを実行しているため、コードにバグがないということです。順序付けられていない部分なしで 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] を貼り付けるのは少しハッキーな気がしますか?
#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