2011-01-12 9 views
1

辞書のNS辞書をソートする必要があります。ソートNSDictionaryの問題

@implementation NSMutableDictionary (sorting) 

-(NSMutableDictionary*)sortDictionary 
{ 
    NSArray *allKeys = [self allKeys]; 
    NSMutableArray *allValues = [NSMutableArray array]; 
    NSMutableArray *sortValues= [NSMutableArray array]; 
    NSMutableArray *sortKeys= [NSMutableArray array]; 

    for(int i=0;i<[[self allValues] count];i++) 
    { 
     [allValues addObject:[NSNumber numberWithFloat:[[[self allValues] objectAtIndex:i] floatValue]]]; 
    } 



    [sortValues addObjectsFromArray:allValues]; 
    [sortKeys addObjectsFromArray:[self allKeys]]; 
    [sortValues sortUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"floatValue" ascending:NO] autorelease]]]; 

    for(int i=0;i<[sortValues count];i++) 
    { 
     [sortKeys replaceObjectAtIndex:i withObject:[allKeys objectAtIndex:[allValues indexOfObject:[sortValues objectAtIndex:i]]]]; 
     [allValues replaceObjectAtIndex:[allValues indexOfObject:[sortValues objectAtIndex:i]] withObject:[NSNull null]]; 
    } 
    NSLog(@"%@", sortKeys); 
    NSLog(@"%@", sortValues); 
    NSLog(@"%@", [NSMutableDictionary dictionaryWithObjects:sortValues forKeys:sortKeys]); 
    return [NSMutableDictionary dictionaryWithObjects:sortValues forKeys:sortKeys]; 
} 

@end 

これはのNSLogの結果である: 1)

{ 
SG, 
RU, 
US 
} 
私はこれをしようとしています

{//dictionary 
      SG = "150.2"; //key and value 
      RU = "110.1"; //key and value 
      US = "50.3"; //key and value 
     } 

:結果は次のようにする必要が

{//dictionary 
     RU = "110.1"; //key and value 
     SG = "150.2"; //key and value 
     US = "50.3"; //key and value 
    } 

:ように見えます

2)

{ 
150.2, 
110.1, 
50.3 
} 

3)

{ 
      RU = "110.1"; 
      SG = "150.2"; 
      US = "50.3"; 
     } 

なぜこの出来事はありますか?この問題で私を助けてくれますか?

答えて

1

NSDictionaryは整理されていないので、どのような順序でNSDIctionaryを構築するかは問題になりません。

NSArrayが規定されています。 NSDictionaryをメモリに整列させたい場合は、何とかキー値のペアのNSArrayを作成する必要があります。また、2つのNSArrayを対応するindecesとともに返すこともできます。

要素の方法だけを反復したい場合は、ソートされたキーの配列を反復処理できます(これはkoreganの提案です)。

+0

okです。サンクス、みんな。 –

5

NSDictionaryは性質上分類されていません。 allKeysallValuesで検索されたオブジェクトの順序は、常に決定されません。注文をリバースエンジニアリングしても、次のシステムアップデートで変更される可能性があります。

定義されており、予測可能な順序でキーを取得するために使用されているallKeysにしかし、より強力な選択肢があります:

  • keysSortedByValueUsingSelector: - 値オブジェクトのcompare:方法に従って昇順にソートするのに便利です。
  • keysSortedByValueUsingComparator: - iOS 4の新機能では、ブロックを使用して並べ替えを実行します。
2

WOW。 Thanx、PeyloW!それは私が必要なものです!私もこのコードを見つけて、結果を並べ替えるのに役立ちます:

@implementation NSString (numericComparison) 

- (NSComparisonResult) floatCompare:(NSString *) other 
{ 
    float myValue = [self floatValue]; 
    float otherValue = [other floatValue]; 
    if (myValue == otherValue) return NSOrderedSame; 
    return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending); 
} 

- (NSComparisonResult) intCompare:(NSString *) other 
{ 
    int myValue = [self intValue]; 
    int otherValue = [other intValue]; 
    if (myValue == otherValue) return NSOrderedSame; 
    return (myValue < otherValue ? NSOrderedAscending : NSOrderedDescending); 
} 

@end 
+3

私の喜び。正しいと思われる答えを受け入れることを忘れないでください。回答を探しているときに他のユーザーを助け、私の自尊心に良い。 – PeyloW