EDAMNotebook と ソート

投稿者: | 2012/07/18

EvernoteSDK でノートブックのリストを取得してみると、ノートブックの並びがバラバラ。
どうやら更新順に並んでいるようです。

アプリなどでノートブックのリストを表示させる場合、
ノートブック名で昇順に並んでいる必要があります。
しかも、スタックにまとめられている場合は、
スタック名がノートブック名に優先して並べられねばなりません。

この並び順を得るためのソートを行なってみました。
ポイントはソートキーをスタックとノートブック名の連結文字列にしたこと。
これによって、ソートを1回で済ませることができます。

まだ荒い部分はありますが、とりあえず並び順は公式クライアントと一致しているはず。
「これおかしい」とか、「ここもっとこう…」とかありましたら、
コメントでもTwitterでも連絡下さると嬉しいです。

// セッション
EvernoteSession* sesssion = [EvernoteSession sharedSession];
// 認証トークン
NSString* authToken = [session authenticationToken];
// ノートストア
EDAMNoteStoreClient* nStore = [session noteStore];

// 配列にノートブックのリストを格納(この段階ではバラバラ)
NSArray* notebooks = [[NSArray alloc] initWithArray:[nStore listNotebooks:authToken]];

// ソート用キーを格納するソート用配列
NSMutableArray* keys = [[NSMutableArray alloc] init];
// ソート用キーをキーにしてノートブックを格納するハッシュ配列
NSMutableDictionary* mdNotebooks = [[NSMutableDictionary alloc] init];

// ノートブックのリストからノートブックを1つずつ取り出し
for ( EDAMNotebook* notebook in notebooks ) {
    // スタック
    NSString* stack = notebook.stack;
    // スタックが無ければ、空文字列を格納
    if ( stack == nil ){ stack = @""; }

    // ソート用キーを生成(ここが肝!スタックとノートブック名を連結した文字列をキーにする
    NSString* sortKey = [[NSString alloc] initWithFormat:@"%@%@", stack, notebook.name];

    // ソート用配列にソート用キーを格納
    [keys addObject:sortKey];
    // ソート用キーをキーにしてノートブックをハッシュ配列に格納
    [mdNotebooks setObject:notebook forKey:sortKey];
}

// ソート後のキーを格納するソート後キー配列
NSArray* sortedKeys = [[NSArray alloc] init];
// ソート用キーをソート
sortedKeys = [(NSArray*)keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

// ソート後のノートブックを格納する配列
NSMutableArray* sortedNotebooks = [[NSMutableArray alloc] init];
// ソート後キー配列からキーを順次取り出し
for ( NSString* key in sortedKeys ) {
    // ノートブックのハッシュ配列からキーを使ってノートブックを取り出し、ソート後ノートブック用配列に格納
    [sortedNotebooks addObject:[mdNotebooks objectForKey:key]];
}

// 中身確認。
for ( EDAMNotebook* notebook in sortedNotebooks ) {
    NSLog(@"%@", notebook.name);
}

 


 

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください