如何仅在不存在的情况下将对象添加到数组中

问题描述 投票:0回答:3

我得到了一个对象数组,例如:Obj1 = {idUser:1,lat:19.0000,lng:-99.0000,active:true}。这是为了监视某些用户,因此,如果一个用户离开,它将其属性活动值从true更改为false,而我必须将其从数组中删除,或者如果某个用户更改其位置,则仅属性坐标值会更改。至此,我已经实现了,问题是,当一个未注册的用户到达时,我需要将其添加到数组中,但是它添加用户的次数是idUser与现有用户不匹配的次数,因此我只需要添加一次。

这里是我使用的代码示例:

    User *u3 = [[User alloc] initWithIdUser:@3 lat:19.417210 lng:-99.163552 active:@"true"];

for (User *u in users) { 
    if ([u3.idUser isEqualToValue:u.idUser] && [u3.active isEqualToString:@"false"]) {
        NSLog(@"User leaves");
        [users removeObject:u];
    } else if ([u3.idUser isEqualToValue:u.idUser] && [u3.active isEqualToString:@"true"]) {
        NSLog(@"User changed location");
        [u setCoordinate:u3.coordinate];
    } else if (![u3.idUser isEqualToValue:u.idUser] && [u3.active isEqualToString:@"true"]) {
        NSLog(@"New user...");
        [users arrayByAddingObject:u3];
    }
}
ios arrays objective-c
3个回答
2
投票

希望它会帮助您。

// array of all active users id
NSArray* idUsersArray =  [users valueForKey:@"idUser"];
// check if user already exist or not
if ([idUsersArray containsObject:u3.idUser]) {

    // get index of user
    NSUInteger index = [idUsersArray indexOfObject:u3.idUser];

    if ([u3.active isEqualToString:@"false"]) {
        [users removeObjectAtIndex:index];
         NSLog(@"User leaves");
    } else {
        User* u = [users objectAtIndex:index];
        [u setCoordinate:u3.coordinate];
        NSLog(@"User changed location");
    }
} else {
    // add user into users array
    [users arrayByAddingObject:u3];
    NSLog(@"New user...");
}

1
投票

显然,新数据将被添加很多次,因为这就是您编写的代码正在尝试做的事情。您可能还会遇到问题,因为在运行快速迭代器时不应修改数组。

NSDictionary是一个更好的数据结构。您可能需要NSInteger和BOOL作为“ idUser”和“ active”成员。


-1
投票

您需要在另一个循环中对照所有用户检查该用户。创建另一个功能

-(BOOL)canAddNewUser:(User*)user {
  for (User *u in users) { 
    if ((u.idUser isEqualToValue:user.idUser)&&([user.active isEqualToString:@"true"])) {
      return YES;
    }
  }
  return NO;
}

然后您的代码将成为:

User *u3 = [[User alloc] initWithIdUser:@3 lat:19.417210 lng:-99.163552 active:@"true"];

for (User *u in users) { 
    if ([u3.idUser isEqualToValue:u.idUser] && [u3.active isEqualToString:@"false"]) {
        NSLog(@"User leaves");
        [users removeObject:u];
    } else if ([u3.idUser isEqualToValue:u.idUser] && [u3.active isEqualToString:@"true"]) {
        NSLog(@"User changed location");
        [u setCoordinate:u3.coordinate];
    } 
}

if ([self canAddNewUser:u3]) {
    NSLog(@"New user...");
    [users arrayByAddingObject:u3];
}
© www.soinside.com 2019 - 2024. All rights reserved.