Подтвердить что ты не робот

Как сравнить 2 nsarray

У меня есть 2 Nsarray, где объекты из 2 массивов одинаковы, могут быть индексы объекта, отличается, но он должен печатать оба равны, независимо от того, существуют ли индексы

NSArray *arr1 = [[NSArray alloc]initWithObjects:@"aa",@"bb",@"1",@"cc", nil];
NSArray *arr2 = [[NSArray alloc]initWithObjects:@"bb",@"cc",@"1",@"aa", nil];

if([arr1 isEqualToArray:arr2])
{
    NSLog(@"equal");
}
else
{
    NSLog(@"Not equal");
}

приведенный выше код печатает "Не равно" , но он должен печатать 'equal', как я могу это сделать

4b9b3361

Ответ 1

Эти два массива не равны. Два массива равны: оба они имеют одинаковые объекты в том же порядке.

Если вы хотите сравнить без учета заказа, вам нужно использовать два объекта NSSet.

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

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

Ответ 2

Большинство ответов здесь фактически не работают для довольно распространенных случаев (см. их комментарии). Существует очень хорошая структура данных, которая решит эту проблему: NSCountedSet.

Счетный набор неупорядочен, но он заботится о количестве присутствующих элементов, поэтому вы не получите @[1, @1, @2] == @[@1, @2, @2].

NSArray *array1 = @[@1, @1, @2];
NSArray *array2 = @[@1, @2, @2];

NSCountedSet *set1 = [[NSCountedSet alloc] initWithArray:array1];
NSCountedSet *set2 = [[NSCountedSet alloc] initWithArray:array2];

BOOL isEqual = [set1 isEqualToSet:set2];
NSLog(@"isEqual:%d", isEqual);

Ответ 3

Попробуйте это. То, что я делаю, это сделать копию вашего первого массива и удалить элементы копирования из второго массива. Если его пустое, то оно равно, иначе не равно.

У этого меньше печати на память, чем у решения @rmaddy. Вы создаете дубликат только одного массива, а не оба массива...

NSMutableArray *copyArray;
if([arr1 count] >= [arr2 count])
{
    copyArray = [NSMutableArray arrayWithArray:arr1];
    [copyArray removeObjectsInArray:arr2];
}
else //c(arr2) > c(arr1)
{
    copyArray = [NSMutableArray arrayWithArray:arr2];
    [copyArray removeObjectsInArray:arr1];
}

if([copyArray count] != 0)
    NSLog('Not Equal');
else
    NSLog('Equal');

UPDATE1: Если вы хотите использовать arr2 после этого, то он был изменен. Вам нужно сделать его копию, а затем в этом случае по размеру памяти это то же самое, что и решение rmaddy. Но все же это решение является превосходным, поскольку время NSSet создания гораздо больше, чем NSArray - источник.

UPDATE2: Обновлено, чтобы сделать ответ более полным, если один массив больше другого.

Ответ 4

Так же, как сказал rmaddy, эти NSArrays не равны. Попробуйте следующее:

-(BOOL)compareArrayIgnoreIndexes:(NSArray*)arrayOne toArray:(NSArray*)arrayTwo{
    NSSet *setOne=[[NSSet alloc]initWithArray:arrayOne];
    NSSet *setTwo=[[NSSet alloc]initWithArray:arrayTwo];
    return [setOne isEqualToSet:setTwo];
}

Ответ 5

Я нашел решение, мы можем добиться этого, сортируя элементы массива

 NSArray *arr1 = [[NSArray alloc]initWithObjects:@"a2223a",@"ab33b",@"a1acdf",@"ac23c45", nil];
    NSArray *arr11 =  [arr1 sortedArrayUsingSelector:@selector(localizedCompare:)];
    NSArray *arr2 = [[NSArray alloc]initWithObjects:@"ab33b",@"ac23c45",@"a1acdf",@"a2223a", nil];
    NSArray *arr22= [arr2 sortedArrayUsingSelector:@selector(localizedCompare:)];
    if([arr11 isEqualToArray:arr22])
    {
        NSLog(@"equal");
    }
    else
    {
        NSLog(@"Not equal");
    }

Ответ 6

This can be done by using one NSMutableArray.The main point to be remembered is that the larger array should be saved in NSMutableArray. Otherwise it wont work as expected. The code is given below.

NSArray *array1 = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil];
NSArray *array2 = [NSArray arrayWithObjects:@"Two", @"Three", @"One", nil];
NSMutableArray *intermediate = [NSMutableArray arrayWithArray:array1];
[intermediate removeObjectsInArray:array2];
NSUInteger difference = [intermediate count];//returns the number of difference between two arrays.

Ответ 7

Другой вариант - преобразовать NSArrays в строки JSON и сравнить с помощью isEqualToString.

-(BOOL)isArray:(NSArray *)firstArray equalContentsToArray:(NSArray *)secondArray {
    if (!firstArray) {
        [email protected][];
    }

    if (!secondArray) {
        [email protected][];
    }

    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:firstArray options:0 error:&error];
    NSString *jsonStringOne = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

    jsonData = [NSJSONSerialization dataWithJSONObject:secondArray options:0 error:&error];
    NSString *jsonStringTwo = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

    BOOL isEqual=NO;

    if ([jsonStringOne isEqualToString:jsonStringTwo]) {
        isEqual=YES;
    }

    return isEqual;
}

Мне было бы интересно узнать о сравнении всех этих методов.