Objective-C Категория Вопрос - PullRequest
0 голосов
/ 17 ноября 2010

Я создал пользовательскую сортировку, создав новую категорию для класса NSString.Ниже приведен мой код.

@implementation NSString (Support)

- (NSComparisonResult)sortByPoint:(NSString *)otherString {
  int first = [self calculateWordValue:self];
  int second = [self calculateWordValue:otherString];

  if (first > second) {
    return NSOrderedAscending;
  }

  else if (first < second) {
    return NSOrderedDescending;
  }

  return NSOrderedSame;
}

- (int)calculateWordValue:(NSString *)word {
  int totalValue = 0;
  NSString *pointPath = [[NSBundle mainBundle] pathForResource:@"pointvalues"ofType:@"plist"];
  NSDictionary *pointDictionary = [[NSDictionary alloc] initWithContentsOfFile:pointPath];

  for (int index = 0; index < [word length]; index++) {
    char currentChar = [word characterAtIndex:index];
    NSString *individual = [[NSString alloc] initWithFormat:@"%c",currentChar];
    individual = [individual uppercaseString];
    NSArray *numbersForKey = [pointDictionary objectForKey:individual];
    NSNumber *num = [numbersForKey objectAtIndex:0];
    totalValue += [num intValue];

    // cleanup
    individual = nil;
    numbersForKey = nil;
    num = nil;
  }

  return totalValue;
}

@end

Мой вопрос заключается в том, создаю ли я словарь точек, чтобы определить значение точки, связанное с каждым символом в алфавите, на основе списка.Затем в моем контроллере представления я вызываю

NSArray *sorted = [words sortedArrayUsingSelector:@selector(sortByPoint:)];

, чтобы отсортировать таблицу слов по значениям точек.Однако создание нового словаря при каждом вызове метода -sortByPoint: крайне неэффективно.Есть ли способ заранее создать pointDictionary и использовать его для каждого последующего вызова в -calculateWordValue:?

Ответы [ 2 ]

4 голосов
/ 17 ноября 2010

Это работа для статического ключевого слова.Если вы сделаете это:

static NSDictionary *pointDictionary = nil
if (pointDictionary==nil) {
    NSString *pointPath = [[NSBundle mainBundle] pathForResource:@"pointvalues" ofType:@"plist"];
    pointDictionary = [[NSDictionary alloc] initWithContentsOfFile:pointPath];
}

pointDictionary будет постоянным в течение всего времени жизни вашего приложения.

Еще одна оптимизация - создать кеш баллов, используя это для каждогоwords:

[dict setObject:[NSNumber numberWithInt:[word calculateWordValue:word]] forKey:word];

Затем используйте метод keysSortedByValueUsingSelector: для извлечения списка слов (обратите внимание, что селектор должен сравниваться:, поскольку сравниваемые объекты являются номерами NSN)., аргумент слова в вашем методе является избыточным.Вместо этого используйте self:

-(int)calculateWordValue {
    ...

    for (int index = 0; index < [self length]; index++)
    {
        char currentChar = [self characterAtIndex:index];
        ...
    }
   ...
}
0 голосов
/ 17 ноября 2010

Измените свой метод sortByPoint:(NSString *) otherString, чтобы взять словарь в качестве параметра и передать ему свой предварительно созданный словарь.

sortByPoint:(NSString *)otherString withDictionary:(NSDictionary *)pointDictionary

РЕДАКТИРОВАТЬ: не будет работать из-за использованияв sortedArrayWithSelector.Извиняюсь.Вместо этого вам может быть лучше создать класс-обертку для словаря точек в виде отдельного элемента, на который вы затем будете получать ссылку при каждом запуске вашей функции сортировки.

In calculateWordValue:

NSDictionary *pointDictionary = [[DictWrapper sharedInstance] dictionary];

DictWrapper имеет NSDictionary в качестве свойства и метод класса sharedInstance (для возврата синглтона. Вы должны установить этот словарь и предварительно инициализировать его, прежде чем выполнять первую сортировку.

...