2012-03-09 8 views
0

の順バケット私は、次のように使用したい興味深いpropertyありObjectNSArrayありますプロパティを持つオブジェクトの私の配列を考える:注文、バケットソート、およびNSMutableArrayの

Object1 - Property Aを。 Object2 - Property A; Object3 - Property B; Object4 - Property D; Object5 - Property D;

Array1 - Objects Object1, Object2

Array2 - Objects Object3

Array3 - Objects Object 4, Object5, Object6

そして、各アレイ内に、ソート使用して:私はこれらの新しい配列にそのプロパティによってソートされたバケットになりたい Object6 - Property D

timeStampプロパティ。

辞書を作成し、if ([dictionary objectForKey:@"propertyVal"]) //add object else // create array for key, add object to arrayのようなプロパティで興味深いオブジェクトを辞書に追加することでこれを巧みに達成しようとしました。このアプローチは、NSMutableDictionaryallKeysForValueを使用してデキューする必要があるため、期待通りには機能しませんでした。これは信頼できません。

私はこれがかなり一般的な問題であると感じています。私はこれをどのように解決するかについての洞察を聞きたいと思います。コードは素晴らしいですが、(適切なオブジェクトを使用する)アルゴリズムでさえ十分です。

+0

辞書の辞書は妥当性があります。 「NSMutableDictionaryをデキーしてください」とは何を意味するのか、なぜそれを行う必要があるのか​​、どのように失敗するのかを説明します。また、 ' - [NSDictionary allKeysForValue]'はありません。 'allKeysForObject'を意味しますか? –

+0

はい、私は 'allKeysForObject'を意味しました。元の文字列を渡すと 'nil'を返します。 –

+0

また、 "NSMutableDictionaryのデキー"とは何ですか?辞書の作成が終わったら、 '-allKeysForObject'を必要とせずに、キーと値(配列)をかなり簡単に反復することができるはずです。 –

答えて

1

これは適切なバケットソートではありませんが、3つのプロパティのセットで動作するはずです。ちょっとした手間がかかり、任意の数のプロパティに対して調整する必要があります:

編集。私は動的なバージョンを作成しました(必要なものだけプロパティタイプを設定しています)。

- (NSMutableArray *)order:(NSDictionary *)objects byProperty:(id)property { 
    NSMutableSet *propertySet = [NSMutableSet setWithCapacity:5]; // so we can count the unique properties 
    for (Object *obj in [objects allValues]) { 
     [propertySet addObject:[obj property]]; 
    } 

    NSMutableArray *objectCollections = [NSMutableArray arrayWithCapacity:[propertySet count]]; 

    // create arrays for every property 
    for (int i = 0; i < [objects allValues]; i++) { 
     NSMutableArray *collection = [NSMutableArray arrayWithCapacity:5]; 
     [objectCollections addObject:collection]; 
    } 
    NSArray *allProperties = [propertySet allObjects]; 

    // push objects into arrays according to a certain property 
    for (Object *obj in [dictionary allValues]) { 
     [[objectCollections objectAtIndex:[allProperties indexOfObject:[obj property]] addObject:obj]; 
    } 

    NSMutableArray *result = [NSMutableArray arrayWithCapacity:[objectCollections count]]; 
    // sort arrays by timestamp 
    for (int i = 0; i < [objectCollections count]; i++) { 
      [result addObject:[[objectCollections objectAtIndex:i] sortedArrayUsingComparator:^(id obj1, id obj2) { 
      if ([(Object *)obj1 timeStamp] > [(Object *)obj2 timeStamp]) { 
       return (NSComparisonResult)NSOrderedAscending; 
      } 
      if ([(Object *)obj1 timeStamp] < [(Object *)obj2 timeStamp]) { 
       return (NSComparisonResult)NSOrderedDescending; 
      }    
      return (NSComparisonResult)NSOrderedSame; 
     }]; 
    } 
    return result; 
} 
+0

問題は、配列 "up front"を作成することは実行可能ではないということです。なぜなら、プロパティA、B、C ...がどのようなものになるのか必ずしも分かっていないからです。彼らは何でもよい。 –

+0

さて、関数内のすべてをラップし、それを動的にします。私のソリューションの一般的なパターンを使用してパラメータ化することができます。 – Alexander

+0

私はそれにスピンを与えるでしょう。 –

関連する問題