2011-12-20 16 views
8

Tôi đang sử dụng NSMutableArray. Tôi muốn tìm nạp các giá trị theo ngày như chúng ta thực hiện trong SQL group by "log_date".Làm cách nào để triển khai "nhóm theo giá trị" trong NSMutableArray?

logMuArray (
     { 
     "log_currenttime" = "4:30pm"; 
     "log_date" = "11.12.2011"; 
     "log_duration" = "1:30"; 
    }, 
     { 
     "log_currenttime" = "4:33pm"; 
     "log_date" = "11.12.2011"; 
     "log_duration" = "2:21"; 
    }, 
     { 
     "log_currenttime" = "4:40pm"; 
     "log_date" = "11.12.2011"; 
     "log_duration" = "5:30"; 
    }, 
     { 
     "log_currenttime" = "7:30pm"; 
     "log_date" = "12.12.2011"; 
     "log_duration" = "1:30"; 
    }, 
     { 
     "log_currenttime" = "7:33pm"; 
     "log_date" = "12.12.2011"; 
     "log_duration" = "2:21"; 
    }, 
     { 
     "log_currenttime" = "7:40pm"; 
     "log_date" = "12.12.2011"; 
     "log_duration" = "5:30"; 
    }, 
     { 
     "log_currenttime" = "07:16pm"; 
     "log_date" = "19.12.2011"; 
     "log_duration" = "0:07"; 
    }, 
     { 
     "log_currenttime" = "7:31pm"; 
     "log_date" = "19.12.2011"; 
     "log_duration" = "0:04"; 
    }, 
     { 
     "log_currenttime" = "7:33pm"; 
     "log_date" = "19.12.2011"; 
     "log_duration" = "0:03"; 
    }, 
     { 
     "log_currenttime" = "7:33pm"; 
     "log_date" = "19.12.2011"; 
     "log_duration" = "0:06"; 
    }, 
     { 
     "log_currenttime" = "7:35pm"; 
     "log_date" = "19.12.2011"; 
     "log_duration" = "0:05"; 
    } 
) 

** Vì vậy, tôi vừa thực hiện ....

NSLog(@"logMuArray %@",[logMuArray valueForKey:@"log_date"]); 

Nhưng tôi muốn lấy ngày UNIQUE chỉ. ** Tôi đã nghĩ về NSPredicate hoặc Biên Đổi Set vv .. .

logMuArray (
    "11.12.2011", 
    "11.12.2011", 
    "11.12.2011", 
    "12.12.2011", 
    "12.12.2011", 
    "12.12.2011", 
    "19.12.2011", 
    "19.12.2011", 
    "19.12.2011", 
    "19.12.2011", 
    "19.12.2011" 
) 

Cảm ơn trước .....

EDIT:

Tôi cũng đã nghe nói về "@distinctUnionOfObjects"

......

+0

Có thể nhận diện đối tượng dựa trên hai hay nhiều phím với cùng một logic? –

+0

Câu hỏi của bạn là tốt, tốt hơn bạn nên đặt một câu hỏi, bởi vì mã cũng được yêu cầu, vì vậy hãy hỏi câu hỏi của bạn trong ngăn xếp tràn. Bên cạnh tôi không có nhiều ý tưởng về điều này, nhưng tôi cần một thời gian để giải quyết nó. Sẽ cố gắng giải quyết nó, nhưng cần một mã để giải quyết nó. Tốt hơn bạn đăng câu hỏi của bạn tại ngăn xếp tràn với mã. cảm ơn –

+0

nó có thể giúp bạn [Xây dựng lại một NSArray bằng cách nhóm các đối tượng w.r.t bất kỳ khóa khớp nào trong mỗi từ điển trong mảng đó] (http: // stackoverflow.com/questions/15375528/rebuild-an-nsarray-by-grouping-objects-that-have-matching-id-numbers/38472661 # 38472661) – umakanta

Trả lời

14

câu trả lời Shanti là gần. Bạn muốn sử dụng toán tử thu thập mã khóa-giá trị @distinctUnionOfObjects. Đặt điều hành ngay trước phím mà bạn muốn nó ảnh hưởng, như thể nó là một phần của con đường quan trọng bạn đang truy cập:

[logMuArray valueForKeyPath:@"@distinctUnionOfObjects.log_date"] 

Thông báo việc sử dụng các valueForKeyPath:, không valueForKey: Điều thứ nhất là một phương pháp trong Giao thức mã hóa khóa-giá trị và cho phép truy cập độ sâu tùy ý của thuộc tính. Đường dẫn chính là NSString tạo thành các phím được phân cách bằng dấu chấm. Kết quả của mỗi lần tra cứu chính được sử dụng lần lượt để truy cập khóa tiếp theo (bắt đầu với bộ thu ban đầu); theo mặc định, valueForKey: được gọi đơn giản ở mỗi bước.

+0

Tôi có thể sử dụng nó với nhiều đường dẫn chính như [log_currenttime, log_date] hay không – wod

3

Bạn có thể sử dụng KVC cho việc này.

[logMuArray valueForKey:@"@distinctUnionOfArrays.log_date"] 

chỉnh sửa: Chỉnh sửa đáp ứng wrt này Josh

[logMuArray valueForKeyPath:@"@distinctUnionOfArrays.log_date"] 
+0

Tại sao điều này cho tôi một lỗi ... hủy bỏ tín hiệu .. ??? trả lời –

+0

[logMuArray valueForKeyPath: @ "@ distinctUnionOfArrays.log_date"], thay đổi valueForKey với valueForKeyPath – Raj

3

Bạn nên sử dụng NSSet cho các hạng mục độc đáo như:

NSSet *filteredData = [NSSet setWithArray:[logMuArray valueForKey:@"log_date"]]; 
+0

điều này làm việc cho tôi tốt ... parul go –

+0

nhờ mogs :) Nhưng trước đây Jash Caswell của anser cũng là tốt đẹp và prefferable .. –

+0

chào đón của bạn ... không quan trọng – Maulik

0

Bạn có thể kết hợp một bộ

Dưới đây là một số ví dụ mã

NSMutableArray * mArray = [NSMutableArray array]; 
NSDictionary *d1 = [NSDictionary dictionaryWithObjectsAndKeys:@"foo",@"bar",@"bar",@"oooo",nil]; 
NSDictionary *d2 = [NSDictionary dictionaryWithObjectsAndKeys:@"boo",@"bar",@"bar",@"oooo",nil]; 
NSDictionary *d3 = [NSDictionary dictionaryWithObjectsAndKeys:@"boo",@"bar",@"bar",@"oooo",nil]; 
[mArray addObject:d1]; 
[mArray addObject:d2]; 
[mArray addObject:d3]; 
NSLog(@"the array\n%@", mArray); 
NSLog(@"just bar %@", [mArray valueForKey:@"bar"]); 
//get unique values 
NSSet * set = [NSSet setWithArray:[mArray valueForKey:@"bar"]]; 
NSLog(@"unique just bar %@", [set allObjects]); 

và đây là sản phẩm

2011-12-20 01:50:59.034 TestEnvironment[32401:207] the array 
(
     { 
     bar = foo; 
     oooo = bar; 
    }, 
     { 
     bar = boo; 
     oooo = bar; 
    }, 
     { 
     bar = boo; 
     oooo = bar; 
    } 
) 
2011-12-20 01:50:59.036 TestEnvironment[32401:207] just bar (
    foo, 
    boo, 
    boo 
) 
2011-12-20 01:50:59.038 TestEnvironment[32401:207] unique just bar (
    foo, 
    boo 
) 
1

Cố gắng logic này có thể giúp bạn

-(NSMutableArray *) makeUnique :(NSMutableArray *) array {  
    int i; 
    int count = [array count]; 
    for (i =0; i< count ; i++) { 
     NSRange range = NSMakeRange (i+1, count); 
     [array removeObject:[array objectAtIndex:i] inRange:range]; 
    } 
    return array; 
} 
Các vấn đề liên quan