Вопрос категории Objective-C
-
25-09-2019 - |
Вопрос
Я создал пользовательскую сортировку, создав новую категорию для 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
Мой вопрос заключается в том, создаю ли я точный словарь для определения значения точки, связанного с каждым символом в алфавите на основе PLIST. Затем в моем контроллере просмотра я звоню
NSArray *sorted = [words sortedArrayUsingSelector:@selector(sortByPoint:)];
сортировать мою таблицу слов по ценностям их точки. Тем не менее, создавая новый словарь каждый раз -sortByPoint:
Способ называется чрезвычайно неэффективным. Есть ли способ заранее создать дорогущую настройку и использовать его для каждого последующего вызова в -calculateWordValue:
?
Решение
Это работа для статического ключевого слова. Если вы сделаете это:
static NSDictionary *pointDictionary = nil
if (pointDictionary==nil) {
NSString *pointPath = [[NSBundle mainBundle] pathForResource:@"pointvalues" ofType:@"plist"];
pointDictionary = [[NSDictionary alloc] initWithContentsOfFile:pointPath];
}
pointDictionary
будет постоянна на всю жизнь вашего приложения.
Еще одна оптимизация - создать кеш баллов, используя это на каждую из ваших слов:
[dict setObject:[NSNumber numberWithInt:[word calculateWordValue:word]] forKey:word];
Затем используйте keysSortedByValueUsingSelector:
Способ извлечения вашего списка слов (обратите внимание на селектор.
Наконец, слов аргумента по вашему методу является избыточным. Используйте себя вместо этого:
-(int)calculateWordValue {
...
for (int index = 0; index < [self length]; index++)
{
char currentChar = [self characterAtIndex:index];
...
}
...
}
Другие советы
Изменить свое sortByPoint:(NSString *) otherString
Способ взять словарь в качестве параметра, и пропустите его предварительно созданный словарь.
sortByPoint:(NSString *)otherString withDictionary:(NSDictionary *)pointDictionary
Редактировать: не будет работать из-за использования в SORTEDARRAYWITHSELECTER. Извинения. Вместо этого вам может быть лучше создание класса Wrapper для вашего словаря, в качестве Singleton, который вы тогда получаете ссылку на каждый раз, когда ваши функции сортировки работают.
В calculateWordValue
:
NSDictionary *pointDictionary = [[DictWrapper sharedInstance] dictionary];
DictWrapper
имеет Nsdictionary в качестве свойства и метод класса sharedInstance
(Чтобы вернуть Singleton. Вы должны установить этот словарь и предварительно инициализировать его, прежде чем вы сначала сортируете.