سؤال

لقد قمت بإنشاء فرز مخصص عن طريق إنشاء فئة جديدة لـ 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: طريقة لاستخراج قائمة الكلمات الخاصة بك (لاحظ أن المحدد يمكن المقارنة: ، لأن الكائنات التي تتم مقارنتها هي nsnumbers).

أخيرًا ، تكون الوسيطة على طريقتك زائدة عن الحاجة. استخدم الذات بدلاً من ذلك:

-(int)calculateWordValue {
    ...

    for (int index = 0; index < [self length]; index++)
    {
        char currentChar = [self characterAtIndex:index];
        ...
    }
   ...
}

نصائح أخرى

تغيير الخاص بك sortByPoint:(NSString *) otherString طريقة لاتخاذ القاموس كمعلمة ، وقم بتمرير القاموس الذي تم إنشاؤه مسبقًا.

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

تحرير: لن تعمل بسبب الاستخدام في sortedarraywithselector. اعتذارات. بدلاً من ذلك ، قد تكون أفضل حالًا في إنشاء فئة Wrapper لقاموس Point الخاص بك باعتباره Singleton الذي تحصل عليه بعد ذلك مرجعًا إلى كل مرة تعمل فيها وظيفة الفرز.

في calculateWordValue:

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

DictWrapper لديه NSDictionary كقرة وطريقة الفصل sharedInstance (لإرجاع المفرد. عليك أن تضع هذا القاموس وإضفاء الطابع المسبق عليه قبل أن تقوم أولاً بالفرز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top