如何基于两种不同的语言对NSArray对象进行排序

时间:2016-03-10 10:14:15

标签: ios objective-c nsarray

我有一个数组。该数组具有两种不同语言的位置(字符串)名称。即阿拉伯语和英语。我希望以阿拉伯语单词首先出现,然后是英语单词排序数组。

此外,我有一个函数,它返回一个布尔值True / False,并告诉我该字符串是否是英文。该数组只包含2个语言。

谢谢大家。由于时间紧迫所以我只是按照旧学校的方法。使用2 For循环并根据语言将数据从源数组复制到新数组。 将在此处查看用户提供的一些有用信息。谢谢大家。

2 个答案:

答案 0 :(得分:0)

你应该这样试试

NSSortDescriptor *sortDescriptor1 = [NSSortDescriptor sortDescriptorWithKey:@"prop" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [NSSortDescriptor
        sortDescriptorWithKey:@"prop"
                    ascending:YES
                   comparator:^NSComparisonResult(id _Nonnull obj1,
                                                  id _Nonnull obj2){
                       if( [self isArabic:obj2] && [self isArabic:obj1])
                           return NSOrderedSame;
                       if ([self isArabic:obj2])
                           return NSOrderedAscending;
                       else if ([self isArabic:obj1])
                           return NSOrderedDescending;
                       else
                           return NSOrderedSame;
                   }];
[self.arrList sortedArrayUsingDescriptors:@[sortDescriptor1, sortDescriptor2]];

答案 1 :(得分:0)

所以你有那个“功能”。我假设这是一个-isEnglish类别的方法(我将其命名为NSString)。 (如果不是,那就去吧。)

然后你有两种方法:

一个。嵌套排序描述符

你可以用两个排序描述符来做到这一点:

NSSortDescriptor *languageSorter = [[NSSortDescriptor alloc] initWithKey:@"isEnglish" ascending:YES];
NSSortDescriptor *wordSorter = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
NSArray *sortedWords = [words sortedArrayUsingSortDescriptors:@[languageSorter, wordSorter];

B中。自定义排序

您可以使用比较器设置自己的排序:

NSArray *sortedWords = [words sortedArrayUsingComparator:
^(id word1, id word2)
{
  // 1. english, 2. arabic
  if( [word1 isEnglish] && ![word2 isEnglish] )
  {
    return (NSComparisonResult)NSOrderedDescending;
  }

  // 1. arabic, 2. english
  else if ( ![word1 isEnglish] && [word2 isEnglish] )
  {
    return (NSComparisonResult)NSOrderedAscending;
  }

  // Both words in the same language, do your "usual" comparision
  …
}

另一种方法是使用NSPredicate-filteredArrayUsingPredicate:(`NSArray')将数组分成两个独立的数组。