Objective c 通过属性在数组中查找特定实例
我有一个数组,其中包含Objective c 通过属性在数组中查找特定实例,objective-c,cocoa-touch,nsarray,Objective C,Cocoa Touch,Nsarray,我有一个数组,其中包含MyClass的各种实例,它有四个属性:int-id、int-valueA、int-valueB和int-valueC。有时,我需要修改特定实例的属性(在本例中,假设它的id等于5) 目前我是这样做的: MyClass *myClass = [[MyClass alloc] init]; for (int i = 0; i < [myMutableArray count]; i++) { myClass = [myMutableArray objectAtI
MyClass
的各种实例,它有四个属性:int-id
、int-valueA
、int-valueB
和int-valueC
。有时,我需要修改特定实例的属性(在本例中,假设它的id
等于5
)
目前我是这样做的:
MyClass *myClass = [[MyClass alloc] init];
for (int i = 0; i < [myMutableArray count]; i++)
{
myClass = [myMutableArray objectAtIndex:i];
if(myClass.id == 5)
{
myClass.valueA = 100;
myClass.valueB = 200;
myClass.valueC = 300;
[myMutableArray replaceObjectAtIndex:i withObject: myClass];
}
}
for (MyClass *iteratorObject in myMutableArray) {
if (iteratorObject.id == 5) {
//do what you want with that specific object
//insert your modified object back into mutable array
}
MyClass*MyClass=[[MyClass alloc]init];
对于(int i=0;i<[myMutableArray count];i++)
{
myClass=[myMutableArray对象索引:i];
如果(myClass.id==5)
{
myClass.valueA=100;
myClass.valueB=200;
myClass.valueC=300;
[myMutableArray replaceObjectAtIndex:i with Object:myClass];
}
}
是否有更好的方法(我不太确定是否更有效)来实现这一点?在开始过度优化之前,您确定这是一个性能瓶颈吗
另一种方法是将实例保存在
NSMutableDictionary
中,其中键是id
的NSNumber
。然后,当您需要更新特定的实例时,只需使用[myMutableDictionary objectForKey:@(someIntId)]
直接检索实例即可。这将使您的O(n)循环变成O(1)哈希表查找[假设一个良好的哈希实现,或者在最坏的情况下是O(logn)]。在开始过度优化之前,您确定这是一个性能瓶颈吗
另一种方法是将实例保存在NSMutableDictionary
中,其中键是id
的NSNumber
。然后,当您需要更新特定的实例时,只需使用[myMutableDictionary objectForKey:@(someIntId)]
直接检索实例即可。这将使你的O(n)循环变成一个O(1)哈希表查找[假设一个好的哈希实现,或者在最坏的情况下是O(logn)]。如果你知道只有一个实例的id
为5,只需添加一个中断更新后,if
语句末尾的code>。这将终止循环迭代,可能是最有效的
在没有评测的情况下,您不应该过分担心运行时性能
要编写更少的代码,可以将
的编写为:
for (MyClass *myClass in myMutableArray) {
如果您仍然需要经常访问单个项目,您可能希望放弃使用阵列存储
另外,不要做:
MyClass *myClass = [[MyClass alloc] init];
因为您不必要地创建了一个从未使用过的实例,只是被扔掉了。如果您知道只有一个实例的id
为5,只需添加一个中断更新后,if
语句末尾的code>。这将终止循环迭代,可能是最有效的
在没有评测的情况下,您不应该过分担心运行时性能
要编写更少的代码,可以将
的编写为:
for (MyClass *myClass in myMutableArray) {
如果您仍然需要经常访问单个项目,您可能希望放弃使用阵列存储
另外,不要做:
MyClass *myClass = [[MyClass alloc] init];
因为您不必要地创建了一个从未使用过的实例,只是被扔掉了。我看到了两种快速优化代码的方法。首先,您不需要原始分配新对象来替换数组中的myClass实例,因为它是指针,实际上您是在直接操作数组中的对象。其次,如果您要使用递增器保留当前for循环,那么MyClass的原始分配是不必要的。您不需要对它执行alloc和init,因为您只需要一个指针。但是,您可以使用for-in循环而不是递增的for循环,直接通过数组进行循环
最终代码:
for (MyClass *myClass in myMutableArray)
{
if(myClass.id == 5)
{
myClass.valueA = 100;
myClass.valueB = 200;
myClass.valueC = 300;
}
}
我看到了两种快速优化代码的方法。首先,您不需要原始分配新对象来替换数组中的myClass实例,因为它是指针,实际上您是在直接操作数组中的对象。其次,如果您要使用递增器保留当前for循环,那么MyClass的原始分配是不必要的。您不需要对它执行alloc和init,因为您只需要一个指针。但是,您可以使用for-in循环而不是递增的for循环,直接通过数组进行循环
最终代码:
for (MyClass *myClass in myMutableArray)
{
if(myClass.id == 5)
{
myClass.valueA = 100;
myClass.valueB = 200;
myClass.valueC = 300;
}
}
通过任何标准获取数组特定成员的一种简单但冗长的方法是使用indexOfObjectPassingTest:
与objectAtIndex:
MyClass * theInstanceIWant;
theInstanceIWant = [myArray objectAtIndex:[dates indexOfObjectPassingTest:^BOOL (id obj, NSUInteger idx, BOOL *stop) {
return ([obj id] == 5);
}];
theInstanceIWant.valueA = 100;
theInstanceIWant.valueB = 200;
theInstanceIWant.valueC = 300;
无需使用replaceObjectAtIndex:withObject:
——名称安装工具
引用数组中的实际对象,您可以在其仍在数组中时更改其属性
(这通过NSArray
上的分类方法变得更令人愉快)
通过任何标准获取数组特定成员的一种简单但冗长的方法是使用indexOfObjectPassingTest:
与objectAtIndex:
MyClass * theInstanceIWant;
theInstanceIWant = [myArray objectAtIndex:[dates indexOfObjectPassingTest:^BOOL (id obj, NSUInteger idx, BOOL *stop) {
return ([obj id] == 5);
}];
theInstanceIWant.valueA = 100;
theInstanceIWant.valueB = 200;
theInstanceIWant.valueC = 300;
无需使用replaceObjectAtIndex:withObject:
——名称安装工具
引用数组中的实际对象,您可以在其仍在数组中时更改其属性
(这通过NSArray
上的分类方法变得更令人愉快)
首先,您永远不想在Objective-C中命名变量id
。id
表示指向任何类型的指针,它是一个保留关键字
一种更好/更有效的方法称为快速枚举。快速枚举是遍历列表/数组/集合中每个项的一种特殊方法。代码如下所示:
MyClass *myClass = [[MyClass alloc] init];
for (int i = 0; i < [myMutableArray count]; i++)
{
myClass = [myMutableArray objectAtIndex:i];
if(myClass.id == 5)
{
myClass.valueA = 100;
myClass.valueB = 200;
myClass.valueC = 300;
[myMutableArray replaceObjectAtIndex:i withObject: myClass];
}
}
for (MyClass *iteratorObject in myMutableArray) {
if (iteratorObject.id == 5) {
//do what you want with that specific object
//insert your modified object back into mutable array
}
虽然这是最简单的方法,但你违反了一条规则。你永远都不应该迟到