2016-12-19 14 views
-3

Я новичок в iOS, и перед вами стоит проблема сравнения двух массивов. Я попробовал этот кодКак сравнить два динамических массива без использования цели цикла c

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

Но это не работает для me.Because мой массив как этот

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 - из веб-сервиса, а arr2 - из основных данных. Вы можете предложить любое другое предложение сравнить этот два массива.

В случае условие я обновляю свой код и другое условие в час вставив

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

Слышь, мне нужно сравнить массив, так что я могу обновить значение в основных данных и, если массив не равны, то Мне нужно вставить их. Так что я не могу использовать loop.Please см. Его else условие, если я использовал цикл, он вставляет данные до тех пор, пока цикл не будет запущен, и я хочу вставить одно значение при щелчке. Так что я не могу использовать loop.

+0

Что вы сравниваете, нет равных элементов в обоих массивах? – vaibhav

+0

@vaibhav Нет, не сравнивая сравнение, содержащее его значение или нет? – Muju

+0

просто вы можете сделать это, используя цикл, будь то подсчет или такое же значение. – vaibhav

ответ

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" 
    } 
} 
+0

Не работает это конус в блоке. – Muju

+0

@Muju какой? , код работает правильно, если у вас нет других типов данных внутри массива (а не NSStrings), тогда это зависит от того, являются ли они определенными пользователем классами или нет, если они были определенными пользователем классами, тогда вам необходимо переопределить метод isEqual внутри вашего класса, если код не работает правильно –

+0

Я добавил что-то вроде этого NSString * element = [NSString stringWithFormat: @ "% @", [firstArray objectAtIndex: index]]; в вашем коде, и это работает. Но – Muju

0

Здесь много способов.

Использование вложенных циклов, чтобы знать точное положение равных элементов:

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. 
    } 
} 
+0

@vainhav Я не хочу использовать цикл. – Muju

+0

y ?. здесь пожилые люди уже поставили ваши вопросы на удержание из-за непредвиденной ситуации, так как я понимаю ее простую проблему, и вы можете сделать это самостоятельно. – vaibhav

+0

@vainbhav, потому что он вставляет данные до тех пор, пока цикл не будет запущен. – Muju

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

Вы можете попробовать это. Это работает для меня с вашими приведенными выше данными.

+0

Когда Я использую ваш код без цикла. его блок if не выполняется. – Muju

+0

После вашего ответа я пробовал свой код без условия. Он получает исполнение. Я считал, что у вас есть только один объект во втором, иначе вы должны зацикливать один из массивов, чтобы получить точный результат. Надеюсь, вы поняли, что можете решить проблему. –

0

Попробуйте этот

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 *[email protected][@"1",@"2",@"3",@"4",@"5",@"6"]; 
NSArray *[email protected][@"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; 
    }]; 
} 
+0

как я могу это сделать без использования цикла. – Muju

0

Из ваших комментариев и титул я думаю:

  1. К "сравнить" и "равно" вы смысл тест членство; и
  2. Ваш второй массив содержит только один элемент (так что нет необходимости в цикле)

Если это правильно, то измените строку:

if([arr1 isEqualToArray:arr2]) 

к

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

который проверяет, содержит ли arr1 первый элемент arr2 (т.е. arr2[0]).

HTH

+0

когда я использую arr2 [0] это авария. – Muju

+0

, и если я использовал arr2, он не выполняется, если блок. – Muju

+0

Вы не предоставляете много деталей, в этом случае, что было сбой? Общие причины. crash, если 'arr1' не является массивом или если у него нет элементов. – CRD

 Смежные вопросы

  • Нет связанных вопросов^_^