2013-06-26 2 views
1

У меня есть массив (большой массив из примера), который содержит многократные массивы, содержащие строки. Мне нужно добавить в bigArray другой массив (такой как arrayA), но я хочу проверить, существует ли такой массив. Если он существует, я не хочу его добавлять. Порядок небольших массивов (например, arrayX из примера) не отличает их друг от друга, поэтому, если у меня уже есть массив, такой как arrayA, содержащий одни и те же массивы, но в другом порядке (arrayZ, arrayY, arrayX вместо arrayX , arrayY, arrayZ, но с тем же строковым содержимым), что массив не будет добавлен в большой массив.Сравнение массива массивов внутри массива с другим массивом массивов строк

Как это сделать?

Примеры:

Массивы Пример:

-bigArray 

--arrayA 

----arrayX -> 16,4,5,6,64 

----arrayY -> 1,3,6,72,14 

----arrayZ -> 13,73,50,34 

--arrayB 

----arrayX -> 1,4,5,6,4,2 

----arrayY -> 1,4,6,12,14 

----arrayZ -> 13,33,50,34 

Порядок маленьких массивов не различает их:

--arrayc 

----array -> 16,4,5,6,64 

----array -> 1,3,6,72,14 

is the same as: 

--arrayd 

----array -> 1,3,6,72,14 

----array -> 16,4,5,6,64 

Поэтому arrayD не будет добавлен в большом массиве ,

ответ

1

Если вы используете NSSet вместо NSArray, вы получаете uniquing бесплатно. Результатом является (изменяемый) набор (неизменяемых) наборов массивов.

NSSet *setA = [NSSet setWithArray:@[ // arrayA 
     @[@16,@4,@5,@6,@64],    // arrayX 
     @[@1,@3,@6,@72,@14],    // arrayY 
     @[@13,@73,@50,@34],    // arrayZ 
    ]]; 

    NSSet *setB = [NSSet setWithArray:@[ // arrayB 
     @[@1,@4,@5,@6,@4,@2],    // arrayX 
     @[@1,@4,@6,@12,@14],    // arrayY 
     @[@13,@33,@50,@34],    // arrayZ 
    ]]; 

    NSMutableArray *bigSet = [NSMutableSet setWithArray:@[setA, setB]]; 

    NSLog(@"%lu", [bigSet count]); 

Печатает "2", как и ожидалось.

NSSet *setC = [NSSet setWithArray:@[ // arrayC 
     @[@1,@4,@6,@12,@14],    // arrayY 
     @[@1,@4,@5,@6,@4,@2],    // arrayX 
     @[@13,@33,@50,@34],    // arrayZ 
    ]]; 

    [bigSet addObject:setC]; 

    NSLog(@"%lu", [bigSet count]); 

Still печатает "2", потому что setC и setB равны.

+0

Это действительно интересно. что произойдет, если я попытаюсь добавить 'NSSet * setB = [NSSet setWithArray: @ [// arrayC @ [@ 4, @ 1, @ 5, @ 6, @ 4, @ 2], // arrayX @ [@ 1, @ 4, @ 6, @ 12, @ 14], // arrayY @ [@ 13, @ 33, @ 50, @ 34], // arrayZ ]]; 'to bigSet? (Я взял arrayB и переключился между первыми двумя числами arrayX) – Segev

+0

@Sha В вашем вопросе вы указали, что внутренние коллекции (или строки?) Сохраняют и сравнивают порядок их элементов.В результате, если вы измените порядок, 'setB' не будет сравниваться с другим набором в' bigSet'. В результате 'bigSet' будет содержать другой элемент. Если вы хотите изменить это поведение, просто измените внутренние массивы (x, y, z) и наборы. –

+0

Действительно замечательная информация. Благодарю. – Segev

0

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

0

Возможно, вы можете использовать ключ и значение в качестве новой строки и сравнить их вместе.

С уважением.

/Daniel Carlsson

1

Вы можете попробовать перебором объектов массива вы хотите добавить (ArrayB) в вашем примере, и попытаться - (BOOL)containsObject:(id)anObject для проверки того, меньших массивов (x, y, и, z) присутствуют в Array A.

if(ArrayA.count!=ArrayB.count){ 
    //Don't check because the arrays will not be same, so add ArrayB 
}else{ 
    int i=0,counter=0; 
    for(i=0;i<ArrayB.count;i++){ 
     if(![ArrayA contains [ArrayB objectAtIndex:i]]){ 
      counter = 1; 
     } 
    } 

    if(counter==1){ 
     //Add ArrayB because elements are not same. 
    }else{ 
     //Don't add ArrayB because elements are same. 
    } 
} 

Попробуйте что-нибудь вроде этого кода.

+0

Это очень хороший ответ, но он не будет охватывать случай, когда есть два одинаковых массива, но массивы внутри них находятся в другом порядке. – Segev