¿Por qué la búsqueda binaria no encuentra mi cadena?

Tengo un archivo txt ordenado como este:

aaa
bbb
ccc
ddd
eee

Quiero comprobar si existe la cadena "ddd" en el archivo ...

Aquí mi func:

- (BOOL) asd:(NSString*)sting 
{
NSArray *LinesCount = 
  [[NSString stringWithContentsOfFile:@"longfile.txt"  
   encoding:NSStringEncodingConversionAllowLossy error:nil]   
    componentsSeparatedByString:@"\r\n"];

unsigned index = (unsigned)CFArrayBSearchValues(
                 (CFArrayRef)LinesCount, 
                 CFRangeMake(0, CFArrayGetCount((CFArrayRef)LinesCount)),
                 (CFStringRef)string, 
                 (CFComparatorFunction)CFStringCompare, 
                 NULL);
if (index < [LinesCount count]) return YES;
return NO;
}

¿Por qué siempre devuelve NO, con cualquier cadena?

preguntado el 29 de septiembre de 11 a las 13:09

¿Su archivo es demasiado grande pero lo carga cada vez que necesita buscar una cadena? -

¿Y sabes que bsearch puede volver? index < [LinesCount count] pero LinesCount no tendrá esa cuerda? -

@Nekto no cargo el archivo todas las veces ... ¡es un fragmento simple para mostrar el problema! ¿Tienes una idea para solucionarlo? -

¿Afecta la regulación de la LinesCount contener algún objeto? -

¿Ha verificado que la matriz "LinesCount" en realidad tiene más de una entrada y que tiene al menos una entrada mayor que la cadena de búsqueda? También podría ser un problema de codificación, eche un vistazo a los valores de datos reales. -

1 Respuestas

El problema está en la forma en que lee la matriz. Si reemplaza el código que asigna LineCount con

NSArray * LinesCount = [NSArray arrayWithObjects:@"aaa", @"bbb", @"ccc", @"ddd", @"eee", nil];

Verá que la búsqueda binaria funciona bien.

Hay dos problemas en su código:

  • El separador de línea probablemente sea solo "\ n" si el archivo se creó en Mac OS X
  • Su matriz contendrá un "" sobrante como último elemento, por lo que ya no se cumple el requisito de ordenar como lo requiere CFArrayBSearchValues.

Como un ejemplo:

 NSLog(@"%@", [@"one\ntwo\n" componentsSeparatedByString:@"\n"]);

rendimientos (tenga en cuenta el último elemento vacío):

 2011-09-29 16:52:33.024 a.out[4019:707] (
     one,
     two,
     ""
 )

Respondido el 29 de Septiembre de 11 a las 17:09

¡Excelente! ¡Este es el problema! ¡La última cadena de mis archivos fue ""! ¡¡Muchas gracias!! - elp

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.