2010-04-06 34 views
7
for (tempI = 0; tempI < 10; tempI++) 
{ 
    tempJ = 1; 
    NSArray *objectsForArray = [NSArray arrayWithObjects:@"array[tempI][tempJ]", @"array[tempI][tempJ+1]", @"array[tempI][tempJ+2]", nil]; 
} 

Tôi có thể viết mã như trên không. Tôi cần lưu trữ giá trị float (array[][]) trong NSArray. Tôi có thể làm được không?
Vấn đề của tôi là, tôi có một ma trận nhưLàm cách nào để lưu trữ giá trị float trong NSArray?

1.0 0.4 0.3 0.5 
2.0 0.4 0.5 0.5 
3.0 4.3 4.9 0.5 

tôi cần phải lấy giá trị (0,4, 0,3, 0,5) sử dụng 1.0, 2.0 3.0. Làm thế nào tôi có thể sử dụng NSDictionary cho điều này?
Cảm ơn bạn

for(tempI = 0; tempI < 5; tempI++) 
{ 
     NSDictionary *dictionary[tempI] = [ [NSDictionary alloc] initWithObjects:@"array[tempI][tempI + 1]", @"array[tempI][tempI + 2]", @"array[tempI][tempI + 3]", @"array[tempI][tempI + 4]", @"array[tempI][tempI + 5]", nil]; 
} 

Tôi có thể viết theo cách này không? Mục tiêu C có chấp nhận nó không?

Tôi nhận được một lỗi như

error: variable-sized object may not be initialized 
+1

Tôi có thể hỏi tại sao bạn muốn để lưu trữ một ma trận 3D vào NSArray? – Prcela

Trả lời

18

NSArray chỉ có thể lưu trữ các đối tượng, không nguyên thủy, Fortunatly, lớp NSNumber có một phương pháp tiện lợi mà mất một nguyên thủy nổi và trả về một đối tượng nổi như vậy:

+ (NSNumber *)numberWithFloat:(float)value 

do đó bạn có thể cư mảng của bạn như thế này:

float exampleFloat = 5.4; 

NSArray *anArrayOfFloatObjects = [NSArray arrayWithObjects: 
            [NSNumber numberWithFloat:10.0], 
            [NSNumber numberWithFloat:2], 
            [NSNumber numberWithFloat:4], 
            [NSNumber numberWithFloat:exampleFloat], 
            nil]; // Don't forget the nil to signal 
              // end of the array 

Đối với vấn đề cụ thể của bạn, bạn có thể viết:

NSMutableArray *tmpArray; // this is necessary since an NSArray can only be initialized 
          // once and we will need to have all the objects that will be 
          // added to the array available to us at once. 

tmpArray = [NSMutableArray arrayWithCapacity:12]; // returns an autoreleased empty array 


for (int col=0; col<=3; col++) { 
    for (int row=0; row<=2; row++) { 
     [tmpArray addObject:[NSNumber numberWithFloat:array[col][row]]]; 
    } 
} 
NSArray *myArray = [NSArray arrayWithArray:tmpArray]; 

như xa như sử dụng một từ điển để truy xuất giá trị ma trận, cách duy nhất Tôi có thể nghĩ rằng sẽ tắt mã khóa giá trị ma trận của bạn như vậy:

A1 A2 A3 A4

B1 B2 B3 B4

C1 C2 C3 C4

D1 D2 D3 D4

ví dụ:

NSMutableDictionary *myDictionary; 

[myDictionary setObject:[NSNumber numberWithFloat:5.0] forKey:@"A1"]; 

... 

NSNumber *myFloat = [myDictionary objectForKey:@"A1"]; 

Ngoài ra, điều quan trọng là chỉ ở đây là bất cứ khi nào một cái gì đó được viết dưới định dạng @ "một cái gì đó ở đây", nó theo nghĩa đen là một đối tượng NSString. vì vậy khi bạn viết:

NSArray *objectsForArray = [NSArray arrayWithObjects: 
              @"array[tempI][tempJ]", 
              @"array[tempI][tempJ+1]",                                    
              @"array[tempI][tempJ+2]", 
              nil]; 

này là chính xác giống như thành văn bản:

NSString *newString = @"Roses are red"; // example strings 
NSString *newString1 = @"Violets are blue"; 
NSString *newString2 = @"array[tempI][tempJ+1]"; 
NSString *newString3 = @"These are all string objects"; 

NSArray *objectsForArray = [NSArray arrayWithObjects: 
              @"array[tempI][tempJ]", 
              newString2,                                   
              @"array[tempI][tempJ+2]", 
              nil]; 
+1

Cảm ơn rất nhiều đã cho tôi làm rõ về NSArray và NSDictionary. Điều đó giúp tôi rất nhiều. –

0

Hãy thử:

for (int tempI = 0; tempI < 10; tempI++) 
{ 
    int tempJ = 1; 
    fl_tempI = float(tempI); 
    NSArray *objectsForArray = [NSArray arrayWithObjects:@"array[fl_tempI][tempJ]", @"array[fl_tempI][tempJ+1]", @"array[fl_tempI][tempJ+2]", nil]; 
} 
Các vấn đề liên quan