IOS / Objective-C: Сортировать NSArray из NSStrings по количеству слов в строке - PullRequest
0 голосов
/ 04 октября 2018

У меня есть массив строк, которые я хотел бы отсортировать по количеству слов в каждой строке.Я, однако, слабо разбираюсь в словарях и массивах и испытываю затруднения при эффективном выполнении этого.

Одним из способов может быть размещение каждой строки в словаре, в котором есть строка и количество слов, и затем сортировка словарей.по количеству слов, используя NSSortDescriptor.

Что-то вроде:

NSArray *myWordGroups = @[@"three",@"one two three",@"one two"];
NSMutableArray *arrayOfDicts=[NSMutableArray new];
for (i=0;i<[myWordGroups count];i++) {
long numWords = [myWordGroups[i] count];
//insert word and number into dictionary and add dictionary to new array

}
NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"numWords"
                                           ascending:NO];
NSArray *sortedArray = [myWords sortedArrayUsingDescriptors:@[sortDescriptor]];

Мне неясно, какой код добавить слово и количество слов в словарь.И даже если бы я знал этот код, он кажется ужасно громоздким.

Есть ли способ быстро отсортировать массив строк по количеству слов в каждом?

Заранее спасибо за любые предложения.

Ответы [ 4 ]

0 голосов
/ 04 октября 2018

Вы должны сначала расширить NSString методом подсчета слов:

@interface NSString(WordCount)
- (NSUInteger)wordCount;
@end

@implementation NSString(WordCount)
- (NSUInteger)wordCount
{
  // There are several ways to do this. Pick up your own on SO or another place of the internet. I took this one:
  __block NSUInteger count = 0;
  [self enumerateSubstringsInRange:NSMakeRange(0, string.length)
                            options:NSStringEnumerationByWords
                         usingBlock:
  ^(NSString *character, NSRange substringRange, NSRange enclosingRange, BOOL *stop) 
  {
    count++;
  }];
  return count;
}

Это имеет преимущества:

  • Вы можете использовать этот метод по другим причинам.
  • Количество слов является свойством строки, поэтому метод должен быть членом класса NSString.

Теперь вы можете просто использовать дескриптор сортировки:

NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"wordCount" ascending:YES];
NSArray *sortedStrings = [myWordGroups sortedArrayUsingDescriptors:@[sorter]];
0 голосов
/ 04 октября 2018

Простая реализация (при условии, что слова в ваших предложениях разделены пробелом) может выглядеть так:

// create a comparator
NSComparisonResult (^comparator)(NSString *, NSString *) = ^ (NSString *firstString, NSString *secondString){
    NSUInteger numberOfWordsInFirstString = [firstString componentsSeparatedByString:@" "].count;
    NSUInteger numberOfWordsInSecondString = [secondString componentsSeparatedByString:@" "].count;

    if (numberOfWordsInFirstString > numberOfWordsInSecondString) {
        return NSOrderedDescending;
    } else if (numberOfWordsInFirstString < numberOfWordsInSecondString) {
        return NSOrderedAscending;
    } else {
        return NSOrderedSame;
    }
};

NSArray *strings = @[@"a word", @"even more words", @"a lot of words", @"more words", @"i can't even count the words"];

// use the comparator to sort your array of strings
NSArray *stringsSortedByNumberOfWords = [strings sortedArrayUsingComparator:comparator];
NSLog(@"%@", stringsSortedByNumberOfWords);

// results in:
// "a word",
// "more words",
// "even more words",
// "a lot of words",
// "i can't even count the words"
0 голосов
/ 04 октября 2018

Вот код Objective-C

NSArray *myWordGroups = @[@"three",@"one two three",@"one two"];

NSArray *sortedStrings = [myWordGroups sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self.length" ascending:YES]]];
// => Sorted Array : @[@"three", @"one two", @"one two three"]
0 голосов
/ 04 октября 2018

У меня есть массив строк, которые я хотел бы отсортировать по количеству слов в каждой строке

Сначала напишите служебный метод, который принимает строку и возвращает количество словв нем (что бы это ни значило для вас).Затем вызовите sortedArrayUsingComparator:, чтобы отсортировать массив строк на основе результата вызова вспомогательного метода для каждого элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...