2012-11-30 4 views

답변

5

음 ... 문제는 NSDictionary와 자연에 의해 순서가 있다는 것입니다.

그래서 가능한 해결책은 "reverseObjectEnumerator"를 사용하여 해당 배열을 역순으로 배열 한 다음 배열에 루프를 만들고 사전에 키를 사용하여 키를 사용하여 NSArray를 만드는 것입니다. 이 같은

뭔가 :

NSDictionary *_dict = [NSDictionary dictionaryWithObjectsAndKeys: 
         @"firstValue",@"firstKey", 
         @"secondValue",@"secondKey", 
         @"thirdValue",@"thirdKey", 
         nil]; 

NSArray *keysNormal = [_dict allKeys]; 
NSArray *keysReversed = [[[_dict allKeys] reverseObjectEnumerator] allObjects]; 

for(NSString *str in keysNormal) 
{ 
    NSLog(@"%@", [_dict objectForKey:str]); 
} 

for(NSString *str in keysReversed) 
{ 
    NSLog(@"%@", [_dict objectForKey:str]); 
} 

로그는 다음과 같습니다

  • thirdValue
  • secondValue
  • firstValue
  • firstValue
  • secondValue
  • thirdValue
7

NSDictionary은 정렬되지 않은 데이터 구조입니다. forward iteration이나 backward iteration의 개념은 없습니다.

foreach 루프에서 NSDictionary를 호출하면 정렬되지 않은 키 목록을 반복합니다. 순서가없는 목록을 반복 할 때 순서는 정의되지 않으므로 순서가 바뀝니다. 카드 더미를 바닥에 흩 뜨린 다음 누군가에게 주문을 취소하도록 요청하는 것과 비슷합니다.

키 (숫자, 알파벳순 등)에 순서 계층 구조가 있다고 가정하면 대신 키 컬렉션을 가져 와서 특정 순서로 정렬 한 다음 키 컬렉션을 반복하거나 역순으로 반복 할 수 있습니다. 그러나 이것이 자주 수행하는 작업 인 경우 NSDictionary이 문제의 데이터 구조에 최상의 선택이 아니라고 생각됩니다.

+0

확인. 하지만 동적으로 데이터를 추가 할 때 (JSON의 메시지 흐름), 내가 추가 한 순서대로 나타납니다. 따라서 NSDictionary를 반복하고 특정 플래그가있는 마지막 메시지 구조를 1로 설정하는 방법을 원합니다. 그래서 끝에서부터 반복해야합니다. 아니면 좀 더 논리적 인 방법이있을 수 있습니다 - 저는 Objective-C 세계를 초보자입니다. – MainstreamDeveloper00

+2

순서가 정의되지 않은 경우 NSDictionary에 삽입 된 마지막 요소 인 Key 컬렉션의 마지막 키를 기대할 수 없습니다. 플래그가 1로 설정된 마지막 메시지가 필요하다는 것을 알고 있으면 각 메시지가 들어올 때마다 확인할 수 있으며 플래그가 1로 설정되어 있으면 NSDictionary 외에 누군가를 저장합니까? 그런 식으로'Flag = 1'을 사용하여 항상 마지막 메시지에 빠르게 접근 할 수 있습니다. – Alan

1
NSArray * a = @[@"a",@"b",@"c"]; 
NSArray * b = [[a reverseObjectEnumerator] allObjects]; 
for (NSString * obj in b) { 
    NSLog(@"%@",obj); 
} 

인쇄 c, b, a. 이처럼 사전의 키를 반전하려고 :

NSArray * key = [[[dict allKeys] reverseObjectEnumerator] allObjects]; 
+1

먼저 키를 정렬 한 다음 역으로 적용하십시오. 그렇지 않으면 NSDictionary에 요소를 추가하자마자 순서가 완전히 변경됩니다. – Alan

+1

이것은 질문에 대답하지 않습니다. 문제는 사전에 순서의 개념이 없기 때문에 시작하기에 아무런 의미가없는 사전을 역순으로 반복하려는 것입니다. 배열에 대한 솔루션은이 질문에 적용되지 않습니다. – rmaddy