2013-07-29 25 views
10

Trong ObjectiveC Tôi có một NSArray, chúng ta hãy gọi nó NSArray* largeArray, và tôi muốn có được một mới NSArray* smallArray chỉ với x đầu tiên các đối tượngLàm cách nào để nhận được các phần tử X đầu tiên có kích thước không xác định NSArray?

... HOẶC trong trường hợp largeArray đã là kích thước < = x Tôi chỉ muốn một bản sao của LargeArray. Vì vậy, cắt xén bất kỳ đối tượng nào sau chỉ mục x.

Cách tiếp cận này:

NSArray *smallArray = [largeArray subarrayWithRange:NSMakeRange(0, x)]; 

Là câu trả lời cho this very similar question. Nhưng nó không thành công với một lỗi nếu largeArray đã nhỏ.

+0

Luôn rẻ để có được kích thước của một mảng. Có lẽ bạn muốn tránh tạo ra các mảng lớn ở nơi đầu tiên? (Giống như, khi đọc các dòng từ một tệp, để dừng sau khi đọc tối đa 100 dòng.) –

Trả lời

25

Bạn có thể làm điều này ...

NSArray *smallArray = [largeArray subarrayWithRange:NSMakeRange(0, MIN(x, largeArray.count))]; 

đó sẽ đưa các yếu tố x đầu tiên hoặc mảng đầy đủ nếu nó nhỏ hơn x.

Nếu largeArray.count là 100.

Nếu x = 110 thì nó sẽ mất 100 kết quả đầu tiên. Nếu x = 90 thì nó sẽ lấy 90 kết quả đầu tiên.

Yep, mà làm việc: D

+0

OK, điều này sẽ hoạt động ngay bây giờ. Bạn không thể chỉ mất MAX hoặc MIN. Bạn cần thêm một chút logic. – Fogmeister

+5

Tại sao không sử dụng 'NSMakeRange (0, MIN (x, largeArray.count))'? – rmaddy

+0

Vì tôi là một thằng ngốc. Tôi đặt MAX vào câu trả lời và nghĩ rằng nó không đúng. Sau đó vì một lý do nào đó tôi cũng loại trừ MIN ... LOL! Đã chỉnh sửa: D – Fogmeister

-5

Đây là chặng đường dài tay rõ ràng để làm việc đó:

NSMutableArray* smallMutableArray; 
if ([largeArray count] <= x) { 
    smallMutableArray = [largeArray copy]; 
} else { 
    for (int i=0; i<x; i++) { 
     [smallMutableArray addObject:[largeArray objectAtIndex:i]]; 
    } 
} 
+0

Như smallArray là một NSArray (như bạn đã nói trong câu hỏi), bạn không thể thêm các đối tượng vào nó bởi vì nó không thay đổi. – Abizern

+0

OK. Hãy gọi nó là smallMutableArray. Nó không phải là tao nhã mà tôi biết. Đó là lý do tại sao tôi hỏi :-) –

+0

Một số vấn đề trong đoạn mã này: 1. 'copy' tạo mảng bất biến. 2. 'smallMutableArray' sẽ không bao giờ được khởi tạo trong trường hợp' else'. 3. Không cần phải tạo subarray bằng tay. 4. Không cần sao chép khi mảng ngắn. –

1

câu trả lời Fogmeister là hoàn toàn tốt, nhưng, trong trường hợp mảng thường là đã đủ nhỏ , câu trả lời đó sẽ không hiệu quả vì nó luôn tạo một bản sao. Đây là phiên bản hiệu quả hơn:

NSAarray *smallArray = largeArray; 
if (smallArray.count > MAX_NUM_ITEMS) 
    smallArray = [smallArray subarrayWithRange:NSMakeRange(0, MAX_NUM_ITEMS)]; 

Khi mảng đã nằm trong giới hạn, phiên bản này sẽ chỉ tham chiếu đến mảng hiện có.

Các vấn đề liên quan