【问题标题】:How to add objects to array only if not exist仅在不存在时如何将对象添加到数组
【发布时间】:2019-12-26 21:48:27
【问题描述】:

我有一个对象数组,例如: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


    【解决方案1】:

    希望对你有帮助。

    // 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...");
    }
    

    【讨论】:

    • 完美运行,正是我想要的,谢谢!
    【解决方案2】:

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

    NSDictionary 是一种更好的数据结构。您可能希望 NSInteger 和 BOOL 用于“idUser”和“active”成员。

    【讨论】:

      【解决方案3】:

      您需要在另一个循环中针对所有用户检查用户。创建另一个函数

      -(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];
      }
      

      【讨论】:

        猜你喜欢
        • 2013-04-15
        • 2019-01-18
        • 2021-08-30
        • 1970-01-01
        • 2016-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-15
        相关资源
        最近更新 更多