2009-11-20 17 views
13

Bir NSArray'ım var ve onu iki eşit parçaya bölmek istiyorum (eğer tek bir sayı varsa "sonra" yeni diziye ekle ") - bunu konuşmak için" ortada "bölmek istiyorum.NSArray iki eşit parçaya nasıl bölülür?

Aşağıdaki kod istediğim tam olarak ne yapar, ancak daha iyi bir yolu ?: leftArray ve rightArray yapıldıktan sonra

// NOTE: `NSArray testableArray` is an NSArray of objects from a class defined elsewhere; 
NSMutableArray *leftArray = [[NSMutableArray alloc] init]; 
NSMutableArray *rightArray = [[NSMutableArray alloc] init]; 

for (int i=0; i < [testableArray count]; i=i+1) { 
if (i < [testableArray count]/2) { 
     [leftArray addObject:[testableArray objectAtIndex:i]]; 
    } 
    else { 
     [rightArray addObject:[testableArray objectAtIndex:i]]; 
    } 
} 

, onları değişmeyecek yoktur, bu yüzden "kesilebilir olması gerekmez ". Ben ObjectsAtIndexes yöntemiyle ya da bazı hızlı numaralandırma yöntemi ile yukarıdaki kodu gerçekleştirmek için bir yol olabilir düşünüyorum ?, ama şu kod işe (ya da diğer varyasyonlar) alamazsınız: eğer

NSArray *leftArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]]]; 
NSArray *rightArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]]]; 

bilen var mı Benimle doğru yönde mi gidiyorum, yoksa doğru yöne mi işaret etmeliyim?

Teşekkürler!

cevap

40

Ayrıca NSArray belgelerinde ayrıntılı -subarrayWithRange: kullanma seçeneği vardır. Kullanın Aşağıdaki kod Alex'in cevabı modifiye

+0

Alex, hızlı yanıtlarınız için teşekkürler! İkinci çözümünüz çok daha iyi. Yukarıdaki örnekte de açıkça belirttiğiniz NSRange'ı uygulamaktan çok fazla vazgeçtim galiba! –

+1

Burada bir hata var. +1'e gerek yok. Örnek: 6 öğeden oluşan bir dizi. ilk NSRange {0, 3} olmalıdır, ikinci NSRange {3, 3} olmalıdır. Durumunuzda bir istisna elde edersiniz çünkü ikinci aralık {4, 3} sınırları dışına çıkar. –

+0

Teşekkürler, Stas. Bu kodu tamir ettim. –

2

yönteminin sonuna nil eklemeyi denediniz mi?

Bu yöntem yeni döndürür
NSArray *firstHalfOfArray; 
NSArray *secondHalfOfArray; 
NSRange someRange; 

someRange.location = 0; 
someRange.length = [wholeArray count]/2; 

firstHalfOfArray = [wholeArray subarrayWithRange:someRange]; 

someRange.location = someRange.length; 
someRange.length = [wholeArray count] - someRange.length; 

secondHalfOfArray = [wholeArray subarrayWithRange:someRange]; 

, autorelease -d diziler:

NSArray *leftArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]], nil]; 
NSArray *rightArray = [[NSArray alloc] initWithObjects:[testableArray objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(????, ????)]], nil]; 
+0

sayesinde böyle bir hızlı yanıt! Yukarıdaki kodu denedim, ancak sınıfımla ilgili bir hata alıyorum, bu yüzden NSRange'ı yanlış belirtiyorum. –

0

ilk dizideki ekstra bir nesneyi isterseniz (durumunda toplam ürün garip):

NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", nil]; 
//NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", nil]; 
//NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; 
//NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", nil]; 
//NSArray *arrayTotal = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", nil]; 

NSArray *arrLeft; 
NSArray *arrRight; 

NSRange range; 
range.location = 0; 
range.length = ([arrayTotal count] % 2) ? ([arrayTotal count]/2) + 1 : ([arrayTotal count]/2); 

arrLeft = [arrayTotal subarrayWithRange:range]; 

range.location = range.length; 
range.length = [arrayTotal count] - range.length; 

arrRight = [arrayTotal subarrayWithRange:range]; 

NSLog(@"Objects: %lu", (unsigned long)[arrLeft count]); 
NSLog(@"%@", [arrLeft description]); 

NSLog(@"Objects: %lu", (unsigned long)[arrRight count]); 
NSLog(@"%@", [arrRight description]);