Ios 遍历两个数组

Ios 遍历两个数组,ios,objective-c,Ios,Objective C,我有一个iOS应用程序,可以将数据从服务器加载到NSArray,然后加载到UITableView 这个很好用。但是,当用户关闭刷新数据时,我会重新调用我的服务器并再次获取数据。此新数据包含本地数据已有的对象和任何新对象 因此,当第一次填充时,localArray将有对象,[A,B,C,D]。然后,我添加一个新的对象服务器端,并在iOS应用程序上刷新数据 serverData现在将有对象[A,B,C,D,E,F]-我需要将E,F添加到localArray 我认为嵌套for循环就是答案,类似这样:

我有一个iOS应用程序,可以将数据从服务器加载到
NSArray
,然后加载到
UITableView

这个很好用。但是,当用户关闭刷新数据时,我会重新调用我的服务器并再次获取数据。此新数据包含本地数据已有的对象和任何新对象

因此,当第一次填充时,
localArray
将有对象,
[A,B,C,D]
。然后,我添加一个新的对象服务器端,并在iOS应用程序上刷新数据

serverData
现在将有对象
[A,B,C,D,E,F]
-我需要将
E,F
添加到
localArray

我认为嵌套for循环就是答案,类似这样:

NSMutableArray *newItems = [NSMutableArray array];
for (BBItem *itemA in serverDataArray){
    for (BBItem *itemB in localArray){
        if (![itemA.name isEqualToString:itemb.named]){
                //add to a newItems array
        }
    }
}

然而,我最终得到了newItems数组,其中包含许多相同项的重复项。这是怎么回事

如果一个项目不等于
localArray
中的一个项目,则您的算法将向
newItems
添加一个项目。因此,在大多数情况下,你会得到很多相同的东西

不能在嵌套循环内添加。您需要遍历所有
localArray
,查看该项是否不存在,然后再添加它。以下是修复代码的方法:

for (BBItem *itemA in serverDataArray){
    BOOL there = NO;
    for (BBItem *itemB in localArray){
        if ([itemA.name isEqualToString:itemb.named]){
            there = YES;
            break;
        }
    }
    if (!there) {
         //add to a newItems array
    }
}
这是低效的,因为内部循环遍历您当前拥有的所有项。随着本地项目数量的增加,此循环将变得越来越慢。您最好维护本地项名称的
NSMutableSet
,因为您可以在常量而不是线性时间中检查它:

NSMutableSet *localNames = [NSMutableSet set];
for (BBItem *itemB in localArray) {
    [localNames addObject:itemB.name];
}
for (BBItem *itemA in serverDataArray){
    if (![localNames containsObject:itemA.name]) {
         //add to a newItems array
    }
}

如果一个项目不等于
localArray
中的一个项目,则您的算法将向
newItems
添加一个项目。因此,在大多数情况下,你会得到很多相同的东西

不能在嵌套循环内添加。您需要遍历所有
localArray
,查看该项是否不存在,然后再添加它。以下是修复代码的方法:

for (BBItem *itemA in serverDataArray){
    BOOL there = NO;
    for (BBItem *itemB in localArray){
        if ([itemA.name isEqualToString:itemb.named]){
            there = YES;
            break;
        }
    }
    if (!there) {
         //add to a newItems array
    }
}
这是低效的,因为内部循环遍历您当前拥有的所有项。随着本地项目数量的增加,此循环将变得越来越慢。您最好维护本地项名称的
NSMutableSet
,因为您可以在常量而不是线性时间中检查它:

NSMutableSet *localNames = [NSMutableSet set];
for (BBItem *itemB in localArray) {
    [localNames addObject:itemB.name];
}
for (BBItem *itemA in serverDataArray){
    if (![localNames containsObject:itemA.name]) {
         //add to a newItems array
    }
}

IseQualtString:itemb.named
而不是
IseQualtString:itemb.name
是一个输入错误吗?您正在为每个不相同的itemb向数组中添加itemA。您正在一次又一次地添加所有项。您需要查看localArray是否包含服务器阵列上的每个项。您正在检查每个组合并添加不匹配的组合。如果local=@[a,b,c]且服务器包含@[b,c,d],则新项目数组将为@[b,b,c,c,d,d]。在调试器中逐步检查代码,您将看到发生了什么。@WojtekSurowka输入错误。wottle=感谢您解释我的代码错误。这有助于把事情弄清楚!
IseQualtString:itemb.named
而不是
IseQualtString:itemb.name
是一个输入错误吗?您正在为每个不相同的itemb向数组中添加itemA。您正在一次又一次地添加所有项。您需要查看localArray是否包含服务器阵列上的每个项。您正在检查每个组合并添加不匹配的组合。如果local=@[a,b,c]且服务器包含@[b,c,d],则新项目数组将为@[b,b,c,c,d,d]。在调试器中逐步检查代码,您将看到发生了什么。@WojtekSurowka输入错误。wottle=感谢您解释我的代码错误。这有助于把事情弄清楚!这很有效。数据集通常不会很大。然而,我对提高效率感兴趣。你能告诉我如何使用NSMutableSet吗?谢谢你更新的代码。我要试试看!这很有效。数据集通常不会很大。然而,我对提高效率感兴趣。你能告诉我如何使用NSMutableSet吗?谢谢你更新的代码。我要试试看!