1
submittedTestArray =   [{
        scheduledTestId = "F7F15169-2FB6-4E47-A971-BAAD40D152AB";
        studentId = "8b3df16f-ff2f-4ad4-839c-6a937b79854d";
        submittedTestId = "37F20871-FB3A-47AA-B254-9E5409C5E4C4";
    }, {
        scheduledTestId = "440947DD-0A01-4DB8-8DD5-CCFA8F852FD3";
        studentId = "8b3df16f-ff2f-4ad4-839c-6a937b79854d";
        submittedTestId = "681689DC-B35C-491C-A737-AB19D9116FD9";
    }, {
        scheduledTestId = "440947DD-0A01-4DB8-8DD5-CCFA8F852FD3";
        studentId = "8b3df16f-ff2f-4ad4-839c-6a937b79854d";
        submittedTestId = "681689DC-B35C-491C-A737-AB19D9116FD9";
    }, {
        scheduledTestId = "440947DD-0A01-4DB8-8DD5-CCFA8F852FD3";
        studentId = "e18ead0a-d0fc-4e15-96ee-ecbd32880d97";
        submittedTestId = "A46965C6-14B1-401E-97C5-AD5BADCC02EE";
    }]

scheduleTestIdに基づいて、すべての NSDictionary オブジェクトを一意に取得したい

上記の例を検討すると、2 つの NSDictionary オブジェクトが得られます。

一時的に次のコードを使用しています。

NSMutableArray *uniqueKeys =  [NSMutableArray arrayWithArray:[submittedTestArray valueForKeyPath:@"@distinctUnionOfObjects.scheduledTestId"]];
NSMutableArray *submittedTestUniqueArray = [[NSMutableArray alloc] initWithCapacity:uniqueKeys.count];
for (SubmittedTest *submittedTest in submittedTestArray) {
    if ([uniqueKeys containsObject:submittedTest.scheduledTestId ]) {
        [uniqueKeys removeObject:submittedTest.scheduledTestId];
        [submittedTestUniqueArray addObject:submittedTest];
    }
}

submitTestUniqueArrayには、目的の出力が含まれています。

[{
    scheduledTestId = "F7F15169-2FB6-4E47-A971-BAAD40D152AB";
    studentId = "8b3df16f-ff2f-4ad4-839c-6a937b79854d";
    submittedTestId = "37F20871-FB3A-47AA-B254-9E5409C5E4C4";
}, {
    scheduledTestId = "440947DD-0A01-4DB8-8DD5-CCFA8F852FD3";
    studentId = "8b3df16f-ff2f-4ad4-839c-6a937b79854d";
    submittedTestId = "681689DC-B35C-491C-A737-AB19D9116FD9";
}]
4

2 に答える 2

0

私が書いていることが的を射ているかどうかはわかりませんが、それでもあえて答えます。

理想的には、あなたが試したことは完璧です。ディクショナリから重複レコードを削除するには、一連のレコードが必要です。この場合、重複する各ディクショナリ要素を他のすべての要素と比較するために、uniqueKeysという名前の配列で、scheduledTestId値を使用します。

そして、これはまさにあなたがしたことです。

このコードで提案できる唯一の改善点は、NSMutableArray *uniqueKeys

に変更しNSArray *uniqueKeys;、比較を終了して一意のレコードを持つ辞書オブジェクトを収集した後、配列要素を 1 つずつ削除するのではなく、フラッシュします。

Cozには2つの可変配列があり、1つは単純に一意のキーを持ち、もう1つは一意のレコードを持つ辞書オブジェクトを持ちますが、意味がありません。もちろん、一意のキーのみを持つ配列は必要ないと思います。必要なのは配列ではなく辞書ですよね?

つまり、コードにパフォーマンスの改善は見られません。

@ALL: 私の技術的知識に改善点があれば教えてください。

乾杯ハッピーコーディング

于 2012-12-27T12:40:53.527 に答える
0

for-in ループの代わりに、for ループを使用し、毎回反復した後

if ([uniqueKeys containsObject:submittedTest.scheduledTestId ]) {
        [uniqueKeys removeObject:submittedTest.scheduledTestId];

    }
else
{
[submittedTestArray removeObjectAtIndex:currentIndex];
}
于 2012-12-26T11:08:04.263 に答える