2016-07-06 11 views
0

以下のコードは、あとで注文されていないことを除いて必要なものです。私は40分以上 "似たような"質問をすべて読んだり、問題を解決したりすることはありません。Objective-CのNSCountedSetに代わって注文を保存する

私は、ある時間内に「イベント」が発生した回数の「毎時」、「毎日」、「毎月」のビューを取得しようとしています。その時間または日付は、グラフを作成し、それがy軸に発生した回数をマークします。表示される文字列をどのように書式設定するかによって、dictArrayを昇順で並べ替えるだけで問題なく動作します。しかしそれは問題だ。毎時ビューの場合、この[午前7時、午前7時、午前7時、午前8時、午前11時、午後11時、午後1時、午後1時、午後3時、午後3時]のような "datesForEvent"配列内の文字列をフォーマットしているので、 NSCountedSetは、グラフのx軸を1pm、3pm、7am、8am、11amのように表示します。明らかに良くない。私の書式設定された文字列を、このような日次ビューとして "datesForEvent"配列に配置すると、[太陽、日の出、日の出、月曜日、火曜日、火曜日、水曜日、木曜日、木曜日、木曜日、金曜日、金曜日、金曜日、金曜日]それは、x軸fri、mon、sat、sun、thu、tue、wedの順でソートされます。同じことが月のビューで起こります。 "Jul"は "Jun"の前に来ます。

これは完全な意味がありますが、これを修正する方法がわかりません。この問題は、文字列を数えられる前にどのように書式を設定するかによって完全に発生します。しかし、カウントの後に文字列を書式設定すると、日付形式がすべてのイベントの長さが同じであるため、これらのイベントがすべて単一のオカレンスとして取得され、グループ化されたオカレンスはミリセカンドまで細かく調整されているためです。言い換えれば、どちらのイベントも重複した時間はありません。私は日付の書式、日付のコンポーネント、日付のスタイル、などのアップル社のドキュメントで無駄とキックを取得している。私は現在、あらゆる種類の助けを求めて、述語ガイドを読んでいます。正しい方向へのプッシュが大いに感謝しています。

以下は問題のコードです。皮肉な部分は、コードがバグフリーであるということです。なぜなら、私はそれが求めていることをしているからです。私は、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ヌル]配列の最後に少しハッキーですか?

#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

順序を保持する配列とカウントを保持するカウントされたセットの2つの構造を使用してください。 – Sulthan

+1

あなたは "NSCountedSet'からどのようにソートするのかを示していませんが、ソートする方法はたくさんありますが、どの関数をソートするか(メソッド、ブロック)、" am (プライマリキー)の前に、より低い数字(セカンダリキー)の前の数字が表示されます。または、24時間制の時計を使用して時間をフォーマットし、グラフ上で12時間に変換するだけです。 HTH – CRD

+0

@CRD興味深く簡単なアイデア。私はまだ月の並べ替えに立ち往生しているだろうが、それは良いスタートです。私は明日それを撃つと、それが私を導く場所を見ます。 – Robert

答えて

0

これは私が最後に行ったものです。

#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 
関連する問題