正しい答えは、大文字と小文字を入れたキーを辞書キーとして使用することです。 これは大文字または小文字に変換するのと同じではないとO(1)平均ケース検索/挿入の複雑さを破棄しません。
残念ながら、Cocoaは文字列を大文字に変換するための適切なNSString
メソッドを持っていないようですが、そのためにCore FoundationにはCFStringFold()
があります。のは、必要な作業を行うために、短い関数を書いてみましょう:
NSString *foldedString(NSString *s, NSLocale *locale)
{
CFMutableStringRef ret = CFStringCreateMutableCopy(kCFAllocatorDefault, 0,
(__bridge CFStringRef)s);
CFStringNormalize(ret, kCFStringNormalizationFormD);
CFStringFold(ret, kCFCompareCaseInsensitive, (__bridge CFLocaleRef)locale);
return (__bridge_transfer NSString *)ret;
}
注ロケール引数が重要であること。 NULL
を指定すると、現在のシステムロケールが取得されます。ほとんどの場合、これは問題ありませんが、トルコのユーザーは、「私」が「ı」ではなく「i」にマッチすることに驚くかもしれません。あなたはゆえ[NSLocale currentLocale]
を渡したい、とあなたは結果あなたかもしれないを保存している場合も、ロケール識別子を保存し、それからロケールを作成することもできます。辞書に追加して、あなたが今
[dict setObject:obj forKey:foldedString(myKey, locale)];
を行うにして一つの最終観測はあなたが大文字小文字を保存したいかもしれないということです
[dict objectForKey:foldedString(myKey, locale)];
再び
をルックアップする必要があるので、
、キーを元の値と一緒に使用すると、辞書へのアクセスごとに折り畳む必要はありません。
適切な正当な理由で賛辞をいただきました。 – andyPaul
それは自分自身が答えて共有している質問です。 – andyPaul
しかし、私は質問をするとき私は自分の質問に答えるのオプションを参照してください。それで、私は何をしたのですか。ところで、評判を得ることにあなたのコメントはかなり皮肉です。私は多くのコーディングスタイルを見て、@ラミーのように答えることもできます。あなたのブログを指定してください、私はそこにそのような質問をすることができます。 – andyPaul