【问题标题】:How to use containsObject in NSMutableArray如何在 NSMutableArray 中使用 containsObject
【发布时间】:2010-08-23 14:56:30
【问题描述】:

我正在尝试查找可变数组中是否有任何对象与我传​​递的对象匹配。请看下面的函数。

name 来自 table view controller,因此被点击的行被保存到 name 并传递给这个函数。我正在尝试检查表视图控制器中的名称是否等于来自数据库的名称。这里的名字指的是名字和姓氏。这就是我附加这些字符串的原因。

请帮助我..我对如何做到这一点感到困惑..如果你有更好的方法请告诉我..非常感谢..我认为它试图比较对象的内存位置(不确定虽然)但是有什么方法可以准确比较我传递的名称..

-(NSMutableDictionary *)getSearchContacts:(NSString *)name
{
 //---retrieve rows--- 
 NSString *qsql =[[NSString stringWithFormat:@"SELECT * FROM CONTACTS WHERE last_name LIKE '%@",[name substringToIndex:1]]stringByAppendingString:@"%' GROUP BY sugar_id ORDER BY last_name"]; 
 NSString *sugar_id;
 NSString *first_name;
 NSString *last_name;
 NSMutableArray *searchContacts=[[NSMutableArray alloc] init];

 sqlite3_stmt *statement;
 if (searchContactName == nil) {
  searchContactName=[[NSString alloc]init];
 }
 if (sqlite3_prepare_v2( db, [qsql UTF8String], -1, &statement, nil) == SQLITE_OK) {
  while (sqlite3_step(statement) == SQLITE_ROW) { 
   sugar_id= [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
   first_name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 3)];
   last_name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 4)];  

   if ([first_name isEqualToString:@"(null)"]) {
    last_name=[last_name stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[last_name substringToIndex:1] uppercaseString]];
    searchContactName=[searchContactName stringByAppendingString:last_name];
    searchContactName=[searchContactName stringByAppendingString:@":"];
    searchContactName=[searchContactName stringByAppendingString:@","];

   }
   else {

    first_name=[first_name stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[first_name substringToIndex:1] uppercaseString]];
    last_name=[last_name stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[last_name substringToIndex:1] uppercaseString]];
    searchContactName=[searchContactName stringByAppendingString:last_name];
    searchContactName=[searchContactName stringByAppendingString:@":"];
    searchContactName=[searchContactName stringByAppendingString:first_name];
    searchContactName=[searchContactName stringByAppendingString:@","];

   }
   [searchContacts addObject:searchContactName];
   //first_name = nil;
   //last_name = nil;
    if ([searchContacts containsObject:name]==YES) {
               searchSugarId=[[NSMutableDictionary alloc]initWithObjectsAndKeys:sugar_id,searchContactName,nil];
   }

  }
  //---deletes the compiled statement from memory--- 
  sqlite3_finalize(statement);
 } 
 return searchSugarId;

}

编辑

姓名:布莱克蒙:瓦伦丁

搜索联系人姓名 Barefield:Collin,Baylis:Efren,Beatty:Peter,Beckwith:Lynn,Benny:Wilma,Bermudes:Lenore,Berryhill:Gerard,Biles:Jodi,Blackmon:Valentin,Blassingame:Rose,Blume:Renae,Bonet:Claude,Bostic: Valerie,Bouldin:雷纳尔多,Bracewell:Brendan,Bradford:Kris,Brathwaite:Bill,Brugger:Ismael,Brumit:Julie,Buchholtz:Mathew,Bunker:Chrystal,Burch:Floyd,Burman:Sang,Butcher:Prince,Butcher:Rory,

搜索联系人 Barefield:Collin,Baylis:Efren,Beatty:Peter,Beckwith:Lynn,Benny:Wilma,Bermudes:Lenore,Berryhill:Gerard,Biles:Jodi,Blackmon:Valentin,Blassingame:Rose,Blume:Renae,Bonet:Claude,Bostic: Valerie,Bouldin:雷纳尔多,Bracewell:Brendan,Bradford:Kris,Brathwaite:Bill,Brugger:Ismael,Brumit:Julie,Buchholtz:Mathew,Bunker:Chrystal,Burch:Floyd,Burman:Sang,Butcher:Prince,Butcher:Rory,

【问题讨论】:

  • 您是否尝试过记录searchContactNamenamesearchContacts 来检查前面的代码?
  • 感谢您的回复..当我尝试在控制台上打印内容时..我得到的名称是正确的..请检查值..我编辑了上面的代码

标签: iphone objective-c nsmutablearray nsarray


【解决方案1】:

containsObject 只会返回一个布尔值。你可能想要 indexOfObject: 方法。

NSInteger index = [array indexForObject:anObject];

我在您的代码中注意到的一件事是您将太多次字符串附加到同一个字符串中。例如为什么不使用

searchContactName = [searchContactName stringByAppendingFormat:@"%@:%@,", last_name, first_name];

而不是

searchContactName=[searchContactName stringByAppendingString:last_name];
    searchContactName=[searchContactName stringByAppendingString:@":"];
    searchContactName=[searchContactName stringByAppendingString:first_name];
    searchContactName=[searchContactName stringByAppendingString:@","];

更重要的是:在执行searchContactName=[searchContactName stringByDoingSomething] 时,请确保 searchContactName 已释放,否则您将泄漏内存。

例如这里:

searchContactName=[[NSString alloc]init];
...
searchContactName=[searchContactName stringByAppendingString:last_name];

您正在泄漏第一个对象,然后您只是通过附加 last_name 创建一个新的(自动释放的)对象。如果你的初始化是这样的:searchContactName=[searchContactName stringByAppendingString:last_name]; 那么就没有必要做[[NSString alloc] init];

;) 希望对你有帮助

【讨论】:

  • 感谢您的回复..我会根据您的建议进行更改..他们非常有帮助..希望我能解决我的问题..
【解决方案2】:

一旦将所有数据都包含在数组中(因此在 while 之外),您需要遍历数组并使用方法 isEqualToString 将名称与当前数组项进行比较。

好的,看看下面的代码:

+ (void)testContact {
NSArray *searchContacts = [NSArray arrayWithObjects:
                                                        @"Barefield:Collin,",
                                                        @"Baylis:Efren,",
                                                        @"Beatty:Peter,",
                                                        @"Beckwith:Lynn,",
                                                        @"Benny:Wilma,",
                                                        @"Bermudes:Lenore,",
                                                        @"Berryhill:Gerard,",
                                                        @"Biles:Jodi,",
                                                        @"Blackmon:Valentin,",
                                                        @"Blassingame:Rose,",
                                                        @"Blume:Renae,",
                                                        @"Bonet:Claude,",
                                                        @"Bostic:Valerie,",
                                                        @"Bouldin:Renaldo,",
                                                        @"Bracewell:Brendan,",
                                                        @"Bradford:Kris,",
                                                        @"Brathwaite:Bill,",
                                                        @"Brugger:Ismael,",
                                                        @"Brumit:Julie,",
                                                        @"Buchholtz:Mathew,",
                                                        @"Bunker:Chrystal,",
                                                        @"Burch:Floyd,",
                                                        @"Burman:Sang,",
                                                        @"Butcher:Prince,",
                                                        @"Butcher:Rory,",nil];
NSString *myContact = @"Blackmon:Valentin,";
for (NSString *contact in searchContacts) {
    if ([contact isEqualToString:myContact]) {
        NSLog(@"FOUND!!!!!");
        break;
    }
}
}

如果您仔细查看,您会发现 myContact 是“Blackmon:Valentin”,它的末尾有一个逗号。在您的数组中,所有元素的末尾都有一个逗号。但根据您在帖子中显示的内容,您要查找的名称,即 Name: Blackmon:Valentin 末尾没有逗号。也许这就是你找不到它的原因。确保在末尾添加逗号,它应该可以工作。

【讨论】:

  • 我试图遍历数组中的值,但即使值相等,它也没有进入循环。我不明白为什么:(这就是我正在做的事情。对于 ( int i=0; i
  • 不知道该说什么,除了:您 100% 确定值相等吗?正如我上面所说,我尝试在 Xcode 中粘贴我在这里的代码,它对我有用。
【解决方案3】:
[mutableArry addObject:[NSNumber numberWithInt:questionNumber]];
NSLog(@"mutableArry=%@",mutableArry);
  NSLog(@" question not complete  count=%d",mutableArry.count);

if (mutableArry.count==25) {
    NSLog(@"25 question complete%d",mutableArry.count);
}

NSString *str= [NSString stringWithFormat:@"%d",questionNumber];
NSLog(@"str=%@",str);



 //  array = [NSArray arrayWithObjects: @"Nicola", @"Margherita",                                       @"Luciano", @"Silvia", nil];
    if ([mutableArry containsObject:str]) // YES
    {
        NSLog(@"Results");

    }

【讨论】:

  • 这是 ofc 行不通的。您可以比较两个不同的对象并期望得到相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多