Pregunta

He creado una clasificación mediante la creación de una nueva categoría para la clase NSString personalizado. A continuación se muestra el código.

@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

Mi pregunta es si puedo crear un diccionario de puntos para determinar el valor del punto asociado a cada carácter del alfabeto basado en un plist. Luego, en mi controlador de vista, que llamo

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

para ordenar mi tabla de palabras por su valor en puntos. Sin embargo, la creación de un nuevo diccionario cada vez que el método se llama -sortByPoint: es extremadamente ineficiente. ¿Hay una manera de crear la pointDictionary de antemano y utilizarlo para cada llamada posterior en el -calculateWordValue:?

¿Fue útil?

Solución

Este es un trabajo para la palabra clave static. Si hace esto:

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

pointDictionary será persistente durante toda la vida de su aplicación.

Otra optimización es la construcción de una memoria caché de resultados mediante el uso de esto en contra de cada una de sus palabras:

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

A continuación, utilice el método keysSortedByValueUsingSelector: para extraer su lista de palabras (tenga en cuenta el selector chould se compara :, ya que los objetos que se comparan son los NSNumbers).

Por último, la palabra argumento del método es redundante. Uso de auto en su lugar:

-(int)calculateWordValue {
    ...

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

Otros consejos

Cambie el método de sortByPoint:(NSString *) otherString tomar el diccionario como un parámetro, y pasarlo su diccionario creado previamente.

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

EDIT: No funciona debido al uso de sortedArrayWithSelector. Disculpas. En cambio, puede ser mejor crear una clase contenedora para el diccionario punto como un conjunto unitario que luego de obtener una referencia a cada vez que se ejecuta la función de clasificación.

En calculateWordValue:

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

DictWrapper tiene una NSDictionary como una propiedad, y una sharedInstance método de clase (para devolver el producto único. Usted tiene que fijar ese diccionario y pre-inicializarlo antes de hacerlo por primera vez la clasificación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top