【问题标题】:How to compare two dynamic array in without using loop objective c [closed]如何在不使用循环目标c的情况下比较两个动态数组[关闭]
【发布时间】:2016-12-19 05:47:14
【问题描述】:

我是 iOS 新手,在比较两个数组时遇到了问题。我试过这段代码

 if ([arr1 isEqualToArray:arr2])
 {
      NSLog(@"Print the output to update...");
 }

但这对我不起作用。因为我的数组是这样的

arr1=[@"1",@"2",@"3",@"4",@"5",@"6"];
arr2=[@"2"];

所以,我尝试了这样的代码

NSSet *set1 = [NSSet setWithArray:arr1];
NSSet *set2 = [NSSet setWithArray:arr2];

if ([set1 isEqualToSet:set2]) {
    // equal
}

但是,这对我不起作用。在我的情况下,arr1 来自 Web 服务,arr2 来自核心数据。您能否提出任何其他建议来比较这两个数组。

在 if 条件下我正在更新我的代码,在 else 条件下我正在插入

if([arr1 isEqualToArray:arr2])
{
   NSManagedObjectContext *context = [self managedObjectContext];

   NSFetchRequest *request = [[NSFetchRequest alloc] init];
   [request setEntity:[NSEntityDescription entityForName:@"EntityName"  inManagedObjectContext:context]];

   NSError *error = nil;
   NSArray *results = [context executeFetchRequest:request error:&error];
   NSManagedObject* favoritsGrabbed = [results objectAtIndex:0];
   [favoritsGrabbed setValue:@"1" forKey:@"Key"];
   // Save the object to persistent store
   if (![context save:&error]) {
      NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
   }
}
else
{
  if (self.device) {
                        // Update existing device
                        [device setValue:Audit forKey:@"key1"];
                        [device setValue:MethodID forKey:@"key2"];
                        [device setValue:CheckPointID forKey:@"key3"];
                        [device setValue:GlobalStringChk forKey:@"key4"];
                        [device setValue:RegionID forKey:@"key5"];
                        [device setValue:BranchID forKey:@"key6"];
                        [device setValue:SiteID forKey:@"key7"];
                        [device setValue:AuID forKey:@"key8"];
                        [device setValue:userid forKey:@"key9"];
                        [device setValue:StringIndex forKey:@"key10"];

                    } else {
                        // Create a new device
                        NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"EntityName" inManagedObjectContext:context];
                        [newDevice setValue:Audit forKey:@"key1"];
                        [newDevice setValue:MethodID forKey:@"key2"];
                        [newDevice setValue:CheckPointID forKey:@"key3"];
                        [newDevice setValue:GlobalStringChk forKey:@"key4"];
                        [newDevice setValue:RegionID forKey:@"key5"];
                        [newDevice setValue:BranchID forKey:@"key6"];
                        [newDevice setValue:SiteID forKey:@"key7"];
                        [newDevice setValue:AuID forKey:@"key8"];
                        [newDevice setValue:userid forKey:@"key9"];
                        [newDevice setValue:StringIndex forKey:@"key10"];
                    }
}

听着,我需要比较数组,以便我可以更新核心数据中的值,如果数组不相等,那么我需要插入它们。所以,我不能使用循环。如果我使用循环,请查看它的 else 条件它插入数据直到循环运行,我想在点击时插入一个值。所以,我不能使用循环。

【问题讨论】:

  • 你在比较什么,两个数组中没有相等的元素?
  • @vaibhav 不比较计数比较它是否包含相同的值?
  • 无论是计数还是相同值,您都可以使用循环来完成。
  • @vaibhav 当我尝试使用循环时它会崩溃,因为两个数组计数不同。
  • 您是否想知道一个数组中的元素是否存在于另一个数组中?

标签: objective-c nsarray nsset


【解决方案1】:

如果您想确定一个数组中的元素是否存在于另一个数组中,您可以尝试以下方法

NSArray * firstArray = @[@"1",@"2",@"3",@"4"];
NSArray * secondArray = @[@"2",@"10",@"20"];

for(int index = 0 ; index < [firstArray count] ; index++)
{
    NSString * element = [firstArray objectAtIndex:index];
    if([secondArray containsObject:element])
    {
       //do stuff
       //This block will execute only when element == @"2"
    }
}

【讨论】:

  • 不工作它是块中的锥体。
  • @Muju 什么? ,代码工作正常,除非你在数组中有其他数据类型(不是 NSStrings),那么这取决于它们是否是用户定义的类,如果它们是用户定义的类,那么你需要覆盖你的类中的 isEqual 方法,如果不是,代码应该可以正常工作
  • 我添加了类似这样的 NSString * element = [NSString stringWithFormat:@"%@",[firstArray objectAtIndex:index]];在您的代码中,它可以工作。但是
  • 但是在其他部分我需要插入值并根据第一个数组计数插入值。但我只想插入一个值并只更新一个元素。
  • 如何在没有循环的情况下做同样的事情。你的答案是正确的,但是我想要没有 for 循环。
【解决方案2】:
for (int i = 0; i < array2.count; i++)
    {
        if ([array1 containsObject:[array2 objectAtIndex:i]])
        {
            NSLog(@"Array1 contains array2 object");
        }
        else
        {
            NSLog(@"Array1 do not contains array2 object");
        }
    }

你可以试试这个。根据您提供的上述数据,这对我有用。

【讨论】:

  • 当我使用没有 for 循环的代码时。它的 if 块不执行。
  • 在您的回复之后,我尝试了没有 if 条件的代码。它得到执行。我考虑过您的第二个对象只有一个对象,否则您必须循环其中一个数组才能获得准确的结果。希望您明白这一点并可以解决问题。
【解决方案3】:

这里有很多方法。

使用嵌套循环知道相等元素的确切位置:

for(int i= 0; i<arr2.count; i++){

    for(int j= 0; j<arr1.count; j++){
        if(arr1[j] == arr2[i])
            NSLog(@"index position: %d element %@:", j, array1[j]);
    }

}

或者你可以使用containsObject: 方法:

containsObject:返回一个布尔值,指示给定对象是否存在于数组中。

for(int i= 0; i<arr2.count; i++){
   if ([arr1 containsObject:[arr2 objectAtIndex:i]]) {
       // indicates whether a given object is present in the array.
   }
}

【讨论】:

  • @vainhav 我不想使用循环。
  • y?。由于不可预见的情况,这里的前辈已经搁置了您的问题,因为我理解这是一个简单的问题,您可以自己解决。
  • @vainbhav 因为它会插入数据直到循环运行。
  • 请查看完整问题。在 if 条件下,我正在更新我的代码,而在 else 条件下,我正在插入。
【解决方案4】:

从你的 cmets 和标题我猜:

  1. “比较”和“相等”是指测试成员身份;和
  2. 您的第二个数组仅包含一项(因此无需循环)

如果这是正确的,那么改变你的行:

if([arr1 isEqualToArray:arr2])

if([arr1 containsObject:arr2[0]])

检查arr1 是否包含arr2 的第一个元素(即arr2[0])。

HTH

【讨论】:

  • 当我使用 arr2[0] 时它崩溃了。
  • 如果我使用 arr2 它不会执行 if block。
  • 您没有提供太多细节,在这种情况下,崩溃是什么?可能的常见原因。如果arr1 不是数组或没有元素,则崩溃。
【解决方案5】:

试试这个

arr1=[@"1",@"2",@"3",@"4",@"5",@"6"];
arr2=[@"2"];

//compare result
BOOL bol = (arr1.count == arr2.count);

// if count equal
if (bol) {  

   for (NSInteger i = 0; i < arr1.count; i++) {  

       NSString *str1 = [arr1 objectAtIndex:i];  
       NSString *str2 = [arr2 objectAtIndex:i];  

       if (![str1 isEqualToString:str2]) {  
          bol = NO;  
          break;  
        }  
    }  
} 

或使用块

NSArray *arr1=@[@"1",@"2",@"3",@"4",@"5",@"6"];
NSArray *arr2=@[@"2"];

//compare result
__block BOOL bol = (arr1.count == arr2.count);

// if count equal
if (bol) {

    [arr1 sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
        if (![obj1 isEqualToString:obj2]) {
            bol = NO;
        }
        return NSOrderedAscending;
    }];
}

【讨论】:

  • 如何在不使用循环的情况下做到这一点。
猜你喜欢
  • 2023-03-19
  • 2013-05-19
  • 1970-01-01
  • 2016-11-05
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
相关资源
最近更新 更多