4

NSSetを使用して次のコンステレーションがあります。

NSSet {
    NSDictionary {
        "Unique-Identifier-Key": Unique Value
        "Key2": ValueABC
        "Key3": ValueDEF
    }

    NSDictionary {
        "Unique-Identifier-Key": Unique Value
        "Key2": ValueFGH
        "Key3": ValueJKL
    }

    NSDictionary {
        "Unique-Identifier-Key": Unique Value
        "Key2": ValueRST
        "Key3": ValueXYZ
    }
}

NSSetから一意の値で1つの辞書を取得する方法を探しています。そのNSSetにはかなり多くのNSDictionariesがあるので、私は最高のパフォーマンスを発揮する方法を探しています。

次のように使っ(NSSet *)objectsPassingTest:(BOOL (^)(id obj, BOOL *stop))predicateてみませんか?

NSString *idSearched = ...;
NSSet *results = [MySet objectsPassingTest:^(id obj,BOOL *stop){
    if ([obj valueForKey:@"Unique-Identifier-Key"] == idSearched) return YES;
    else return NO;
}];

これは最もパフォーマンスの高いソリューションですか?NSSetは、オブジェクトの検索においてNSArrayよりも優れたパフォーマンスを発揮することを読んだときにNSSetを使用しました。そして、オブジェクトの順序付けられたシーケンスは必要ありません。

4

2 に答える 2

5

私はあなたが望む実際のレイアウトは次のとおりだと思います:

NSDictionary {
    Unique Value: NSDictionary {
        "Key2": ValueABC
        "Key3": ValueDEF
    }

    Unique Value: NSDictionary {
        "Key2": ValueFGH
        "Key3": ValueJKL
    }

    Unique Value: NSDictionary {
        "Key2": ValueRST
        "Key3": ValueXYZ
    }
}

基本的に、一意のキーと値のペアをディクショナリ内に格納するのではなく、一意の値が他のデータのキーである新しいディクショナリを用意します。一意の値がNSStringthenの場合、おそらくO(1)時間計算量に近づくでしょう。

次のコードを使用して、セットを上記のレイアウトに変換できます。

NSMutableDictionary *searchable = [NSMutableDictionary dictionary];
for (NSDictionary *dict in MySet)
    [searchable setObject:dict forKey:[dict objectForKey:@"Unique-Identifier-Key"]];

(ただし、データをセットから変換するよりも、上記の構造に直接データをロードする方が適切です)。次に、辞書の1つを見つけたいときはいつでも:

NSDictionary *dict = [searchable objectForKey:idSearched];
于 2013-02-03T23:37:14.137 に答える
0

そのように使うとパフォーマンスに役立つとは思いませんNSSetNSSetハッシュアルゴリズムまたは一部の並べ替えアルゴリズムにより、NSArrayよりもパフォーマンスが向上します。そのような述語を使用する場合、NSSet必要なアイテムを見つけるためにコレクション全体を検索する必要があると思います。

を含む新しいクラスMyObjectを作成し、とをオーバーライドすることをお勧めしますNSDictionaryhashisEqual

- (BOOL)isEqual:(id)object;
- (NSUInteger)hash;

ハッシュでは、一意の値のハッシュを返します。これにより、パフォーマンスが向上します。ただし、検索する必要のあるオブジェクトが非常に少ない場合は、単純な述語を使用するだけで済みます。

于 2013-02-03T23:06:33.907 に答える