0

我通过为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:调用该方法时都创建一个新字典是非常低效的。有没有办法预先创建 pointDictionary 并将其用于 中的每个后续调用-calculateWordValue:

4

2 回答 2

4

这是静态关键字的工作。如果你这样做:

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:方法提取单词列表(注意选择器应该是 compare:,因为被比较的对象是 NSNumbers)。

最后,您的方法中的参数这个词是多余的。使用 self 代替:

-(int)calculateWordValue {
    ...

    for (int index = 0; index < [self length]; index++)
    {
        char currentChar = [self characterAtIndex:index];
        ...
    }
   ...
}
于 2010-11-17T20:07:00.907 回答
0

更改您的sortByPoint:(NSString *) otherString方法以将字典作为参数,并将其传递给您预先创建的字典。

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

编辑:由于在 sortedArrayWithSelector 中的使用而无法工作。道歉。相反,您最好为点字典创建一个包装类作为单例,然后在每次运行排序函数时获取对它的引用。

calculateWordValue

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

DictWrapper有一个 NSDictionary 作为属性和一个类方法sharedInstance(返回单例。在第一次排序之前,您必须设置该字典并预初始化它。

于 2010-11-17T19:41:58.683 回答