CCDictionaryをキーの昇順にソートする
cocos2d-xには辞書型のデータ型でCCDictionaryというものが用意されている。
ちなみにリスト型だとCCArray。
で、この辞書をキーの昇順でソートしたかったんだけどそんな機能はない。
あんまり世間的には需要ないのかね?
俺も本当は別にどうでもよかったけど仕事でバグ呼ばわりされたので調べたんだけど見当たらなくって
仕方ないから自前で実装することにした。
やることは単純で
1.キーを取り出して昇順ソートする
2.ソートしたキーで1つずつデータを取り出して新しい辞書データを作る
の2つだけ。
ちなみに
1のキーの取得についてはCCDictionaryのallKeysメソッドで簡単に取得できる。
ただこのメソッドの返り値がCCArray型で困ったことにCCArrayにもまた標準でソートするメソッドはない。
こっちは需要あると思うんだけどなぁ。。。
で、色々ググって試したところ以下のやり方でうまく行った。
CCArray* keys = dic->allKeys(); // キーのリストを取得
std::sort(keys->data->arr, keys->data->arr + keys->data->num, compare); // ソート
ソートの最後の引数compareはソートルールの関数になるので以下のように用意する。
bool compare(CCObject *a, CCObject *b) {
return ((CCString*)a)->intValue() < ((CCString*)b)->intValue();
}
あとはこのkeysのデータをCCARRAY_FOREACHなどで1つずつ取って最初の辞書からデータを取ればおしまい。
やりたいことはシンプルなのにものっそめんどかった。
もっと簡単なやり方があるのかもしれんけどcocos2d-xでググると英語ならまだしも中国語が出てくるからもうさっぱり。