1

オブジェクトのNSArrayがあります(NSStringsではなく、カスタムオブジェクト)。各オブジェクトには、obj.name 以下に示すようにNSMutableArrayを名前で並べ替える方法を知っている値があります

 NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
 [array sortUsingDescriptors:[NSArray arrayWithObject:sort]];

ただし、一部の名前は「The」、「A」、または「An」で始まります。これらはすべて、名前の次の単語が表示された場合はスキップします。これらの3つのケースを回避し、それらが表示された場合は自動的に次の単語にシフトする方法はありますか?

4

4 に答える 4

5

これまでに投稿されたすべての回答にあえて反対する場合、文字通りの質問に対する最も簡単な回答は、調整された文字列を返すカスタム クラスにゲッターを実装することです。

- (NSString *)canonicalName
{
    if([self.name rangeOfString:@"The "].location == 0)
        return [self.name subStringFromIndex:4];

    // etc, etc
}

次に、ソート記述子に「canonicalName」を指定してソートします。

ただし、最初にQA1159NSStringのアドバイスに従うことを検討する必要があります。実装しようとしているルールをスーパーセットすると思われる Finder によって適用されるのと同じルールに従って、 の固有の順序付け機能を使用するだけです。localizedCompare:そのため、最初から iOS で利用可能だった を介して文字列を比較することになります。それ以外の場合は、重要な車輪をほとんど再発明しています。

例えば

[array sortUsingComparator:
    ^NSComparisonResult(YourObjectType *obj1, YourObjectType *obj2)
    {
         return [obj1.name localizedCompare:obj2.name];
    }];
于 2013-01-25T23:27:09.433 に答える
3

独自のソート方法を記述できる「sortUsingSelector」を実行することをお勧めします。これらの条件について 3 つのチェックを実行し、比較した 2 つの文字列を返すことができます。

于 2013-01-25T22:54:49.693 に答える
1

使用できますsortedArrayUsingSelectorNSArray クラス リファレンスを確認してください

于 2013-01-25T22:56:38.093 に答える
1

次のように、独自の比較関数を実装する必要があります (これは非常に大雑把で、よりエレガントに実行できますが、概念の証明としてのみ使用できます)。

static NSInteger myCompare(NSString *obj1, NSString *obj2, void *context)
{
  NSString *str1;
  if ([obj1 hasPrefix:@"A "]) str1 = [obj1 substringFromIndex:2];
  else if ([obj1 hasPrefix:@"An "]) str1 = [obj1 substringFromIndex:3];
  else if ([obj1 hasPrefix:@"The "]) str1 = [obj1 substringFromIndex:4];
  else str1 = obj1;

  NSString *str2;
  if ([obj2 hasPrefix:@"A "]) str2 = [obj2 substringFromIndex:2];
  else if ([obj2 hasPrefix:@"An "]) str2 = [obj2 substringFromIndex:3];
  else if ([obj2 hasPrefix:@"The "]) str2 = [obj2 substringFromIndex:4];
  else str2 = obj2;

  return [str1 compare:str2];
}

sortedArrayUsingFunction次に、それを使用して呼び出します。

sortedArray = [array sortedArrayUsingFunction:myCompare context:NULL];
于 2013-01-25T23:00:22.947 に答える