1

重複の可能性:
順序付けられたキーを持つ NSDictionary

私は iOS 用の XMPPFramework を使用していますが、部屋の占有者を含む NSDictionary が、新しい占有者/要素が挿入されるたびにそのコンテンツの順序を変更することに非常に驚いています。

各挿入後の出力は次のとおりです。

<CFBasicHash 0xbccbd60 [0x1f02400]>{type = mutable dict, count = 2,entries =>
1 : <CFString 0xbcd90b0 [0x1f02400]>{contents = "4ee90610e4b08c62894a648c"} = <XMPPRoomOccupant: 0xbcd9360>
2 : <CFString 0xbe5a160 [0x1f02400]>{contents = "4eea53a6e4b08c62894a6c90"} =     <XMPPRoomOccupant: 0xbca7cc0>
}

<CFBasicHash 0xbccbd60 [0x1f02400]>{type = mutable dict, count = 3,entries =>
0 : <CFString 0xbe60710 [0x1f02400]>{contents = "4ee8fca3e4b08c62894a6489"} = <XMPPRoomOccupant: 0xbe61370>
1 : <CFString 0xbcd90b0 [0x1f02400]>{contents = "4ee90610e4b08c62894a648c"} = <XMPPRoomOccupant: 0xbcd9360>
2 : <CFString 0xbe5a160 [0x1f02400]>{contents = "4eea53a6e4b08c62894a6c90"} = <XMPPRoomOccupant: 0xbca7cc0>
}

<CFBasicHash 0xbccbd60 [0x1f02400]>{type = mutable dict, count = 4,entries =>
0 : <CFString 0xbe5a160 [0x1f02400]>{contents = "4eea53a6e4b08c62894a6c90"} = <XMPPRoomOccupant: 0xbca7cc0>
4 : <CFString 0xbe71eb0 [0x1f02400]>{contents = "4f7ade44e4b09cb64dc33b90"} = <XMPPRoomOccupant: 0xbe72950>
5 : <CFString 0xbe60710 [0x1f02400]>{contents = "4ee8fca3e4b08c62894a6489"} = <XMPPRoomOccupant: 0xbe61370>
6 : <CFString 0xbcd90b0 [0x1f02400]>{contents = "4ee90610e4b08c62894a648c"} = <XMPPRoomOccupant: 0xbcd9360>
}

この最後の挿入でわかるように、2 つの要素の順序が変更され、インデックスも変更されました。これは正常ですか?私はコードとその挿入を以下を使用して見ました:

[占有者 setObject:占有者 forKey:aNickName];

挿入された順序で要素を保存する必要があります。また、文字列を介して要素にアクセスする必要もあります。何か案が?

ありがとう

4

3 に答える 3

1

NSDictionary は順序を含む準備ができておらず、キーオブジェクトのペアを含む準備ができています。順序を維持したい場合は、NSArray のような別のソリューションが必要です。

実装について再考する必要があるかもしれません。

于 2012-04-20T09:11:02.057 に答える
0

NSDictionary は、キーと値のペアがどのように挿入されたかを覚えていないと思います。キーまたは値を のようsortedArrayUsingSelector:に並べ替えることができますが、順序が重要な場合は、代わりに NSArray を使用する必要があります。

于 2012-04-20T09:11:27.987 に答える
0

順序のないマップであるため、キーが内に格納される順序について心配する必要はありません。値を取得NSDictionaryする順序は非常に重要であるため、キーをソートし、ソートされた順序で値にアクセスする必要があります。

キーをアルファベット順に並べ替え、値を順番に取得する例を次に示します。

NSArray *sortedKeys =[[dict allKeys] sortedArrayUsingSelector:@selector(compare:)];
for (NSString *key in sortedKeys)
{
    NSString *value = [dict objectWithKey:key];
}
于 2012-04-20T09:12:05.997 に答える