代码之家  ›  专栏  ›  技术社区  ›  aahrens

目标C类问题

  •  0
  • aahrens  · 技术社区  · 14 年前

    我创建了一个自定义排序,方法是为 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: ?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Dave DeLong    14 年前

    这是静态关键字的作业。如果您这样做:

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

    最后,您方法上的单词参数是多余的。用自己来代替:

    -(int)calculateWordValue {
        ...
    
        for (int index = 0; index < [self length]; index++)
        {
            char currentChar = [self characterAtIndex:index];
            ...
        }
       ...
    }
    
        2
  •  0
  •   Tim    14 年前

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

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

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

    calculateWordValue :

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

    DictWrapper 具有NSDictionary作为属性和类方法 sharedInstance (把单人票还给我。在进行第一次排序之前,必须设置字典并对其进行预初始化。