【问题标题】:Search String into NSArray based on charcters order?根据字符顺序将字符串搜索到 NSArray 中?
【发布时间】:2012-10-31 19:40:52
【问题描述】:

我的问题场景是这样的。我有一个 NSMutableArray (每个对象都是 Nsstring)。我有一个用于搜索的 UItextField(如客户所说)。

我想知道如何像这样在 NSMutableArray 中搜索字符串

如果我在文本字段中键入 A,则只有那些内容来自 NSMutableArray,它从 A 开始。 如果我在 TextField 中键入 AB,则只有那些内容来自从 AB 开始的 NSMutableArray。 …… 我正在尝试 NSRange 概念我喜欢分享 Mycode

~

  for (int i=0; i<[[localTotalArrayForAwailable objectForKey:@"PUNCH"] count]; i++)
{

    NSString *drinkNamePuch= [[[localTotalArrayForAwailable objectForKey:@"PUNCH"]  objectAtIndex:i] drinkNames];

    NSRange titleResultsRange = [drinkNamePuch rangeOfString:searchText options:( NSCaseInsensitiveSearch)];

    if (titleResultsRange.length>0)
    {
        [searchArraypuch addObject:[[localTotalArrayForAwailable objectForKey:@"PUNCH"]  objectAtIndex:i]];
        [copyListOfItems setValue:searchArraypuch forKey:@"PUNCH"];
    }
}

~

基于此代码搜索无法正常工作,因为我需要。

谢谢

【问题讨论】:

  • 为什么不用我的两行代码?你不需要遍历你的数组来查找东西!
  • 顺便说一句:从我能得出的结论来看,你在做什么,你应该在循环之后做[copyListOfItems setValue:searchArraypuch forKey:@"PUNCH"];

标签: iphone ios ipad nsstring nsmutablearray


【解决方案1】:

如果您试图从一开始就查找与您的searchText 匹配的所有字符串,那么您应该检查:

if ( titleresultsRange.location == 0 )

除此之外,我不确定什么是“工作不正常”,您需要更好地解释您的预期结果是什么,以及您的实际结果是什么。

【讨论】:

  • 假设我只想搜索那些以 ABC 开头的 NSMutableArray。如果我使用我的代码,它将返回所有具有 ABC (不区分大小写)的字符串。但我只想要那些以 ABC 开头的字符串。 .. 示例如下:- 使用 Like 搜索查询“ABC%..”搜索数据库表,类似于搜索概念 ..
  • @Mukesh 尝试使用我上面的条件,而不是检查长度。
【解决方案2】:

这样做;

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[cd] %@", searchText];
NSArray* filteredStrings = [[localTotalArrayForAwailable objectForKey:@"PUNCH"]  filteredArrayUsingPredicate:predicate];

在filteredStrings 中你得到了所有以searchText 开头的字符串。

您可能会发现Predicate Programming Guide 很有帮助。

【讨论】:

    【解决方案3】:

    试试这个逻辑......它正在工作

     NSMutableArray *arr = [[NSMutableArray alloc]initWithObjects:@"aa",@"bbb",@"bb",@"cc",@"dd",@"ee",@"ff",@"gg",@"hh",@"ii", nil];
    NSMutableArray *arrNew = [[NSMutableArray alloc]init];
    NSString *strSearch = @"cccc";
    int k = strSearch.length;
    for (int i=0; i<[arr count]; i++) {
        for (int j=0; j<k; j++) {
            if (k<=[[arr objectAtIndex:i] length]) {
                if ([strSearch characterAtIndex:j] != [[arr objectAtIndex:i]characterAtIndex:j]) {
                    break;
                }
                else if(j == k-1){
                    [arrNew addObject:[arr objectAtIndex:i]];
                }
            }
        }
    }
    NSLog(@"%@",[arrNew description]);
    

    【讨论】:

      【解决方案4】:

      你可以使用NSArray/NSMutableArray提供的这些方法:

      1. NSArray 中,请参阅“在数组中查找对象”部分了解以“indexesOfObjects...”开头的过滤方法,例如indexesOfObjectsPassingTest:

      2. NSArray 中的方法filteredArrayUsingPredicate: 参见“派生新数组”部分

      3. NSMutableArray中有一个方法filterUsingPredicate:

      为了缩小结果范围,您可以继续将过滤连续应用于过滤后的数组或索引集。


      indexesOfObjectsPassingTest: 使用 block 的示例:

      NSArray *strings = [NSArray arrayWithObjects:@"A", @"a", @"aB", @"AbC", @"Bag", @"Babc", @"baCK", @"", @"dba", nil];
      NSString *searchString = @"Ab";
      
      BOOL (^startsWithPredicate)(id, NSUInteger, BOOL*) = ^BOOL (id obj, NSUInteger idx, BOOL *stop) {
          NSString *string = (NSString *) obj;
          NSRange range = [string rangeOfString:searchString options:NSCaseInsensitiveSearch];
          return (range.location == 0);
      };
      
      NSIndexSet *indexSet = [strings indexesOfObjectsPassingTest:startsWithPredicate];
      NSLog(@"Strings found: %@", [strings objectsAtIndexes:indexSet]);
      

      输出:

      Strings found: (
          aB,
          AbC
      )
      

      【讨论】:

        猜你喜欢
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 2023-01-21
        • 2013-12-13
        • 1970-01-01
        相关资源
        最近更新 更多