7

私は持っていNSMutableArray oldArrayます。ここで、ある時点で、このNSMutableArrayオブジェクトは別の で更新されます。このオブジェクトはNSMutableArray、前の よりも多い、少ない、または同じ数の要素を持つ可能性がありますNSMutableArray

古い配列と新しい配列の変更を比較したい。私が欲しいのは2つNSArrayの saddedArrayremovedArray、古い配列に追加および/または削除された要素のインデックスが含まれます。

この問題全体は、例を使用するとより明確になります。

oldArray = {@"a",@"b",@"d",@"e",@"g"};

newArray = {@"a",@"c",@"d",@"e",@"f",@"h"};

したがって、ここで削除されたオブジェクトは、それぞれインデックス 1 と 4 の @"b" と @"g" です。追加されるオブジェクトは、インデックス 1、4、および 5 の @"c"、@"f"、および @"h" です (最初のオブジェクトが削除され、次に追加されます)。

したがって、

removedArray = {1,4};  and  addedArray = {1,4,5};

これらの 2 つの配列を効率的に取得する方法がremovedArray必要addedArrayですNSMutableArray。ありがとう!問題があまり理解できない場合は、喜んでさらに情報を提供します。

編集 1

これを何に使いたいのかを説明すると、おそらくより明確になるでしょう。

実際に私がこれを使用しているのは、テーブルビューがロードされた後にメソッドinsertRowsAtIndexPathsremoveRowsAtIndexPathsアニメーションで UITableView を更新することです。これにより、ユーザーは削除された行が出て新しい行が入ってくるのを見ることができます.テーブルビューは、ユーザーができるお気に入り要素を保存します追加または削除します。したがって、いくつかのお気に入りを追加していくつかを削除した後; ユーザーがお気に入りのテーブルビューに戻ると、アニメーションが表示されます。

編集 2

これは前に述べたはずですが、古い配列と新しい配列の両方の要素は昇順になります。削除または追加のインデックスのみが重要です。順序は変更できません。元。{@"b",@"a",@"c",@"d"}を配列にすることはできません。

4

3 に答える 3

5

ループと if 条件を使用して古い配列と新しい配列を繰り返し処理しようとしましたが、本当に面倒でバグが多くなっています。

これは単純な問題ではありません。まず、複数のソリューションがある可能性があることに注意してください。

a b c d
b c d e

(a={0, 1, 2, 3}, r={0, 1, 2, 3})との両方(a={3}, r={0})が有効なソリューションです。おそらくあなたが探しているのは、最小限のソリューションです。

最小解を得る 1 つの方法は、2 つのシーケンスの最長共通部分シーケンス (LCS)を見つけることです。LCS を見つけるためのアルゴリズムは、2 つのシーケンスのどの要素が LCS に属し、どの要素が属していないかを教えてくれます。LCS にない元の配列の各要素のインデックスは、removed配列に入ります。LCS にない新しい配列の要素のインデックスは、added配列に入ります。

以下にいくつかの例を示します (LCS の要素を括弧で囲みました)。

 0  1   2   3   4   5
(a) b  (d) (e)  g
(a) c  (d) (e)  f   h

oldLCSにない項目は 1 と 4 です。LCSにない項目はnew1、4、および 5 です。

別の例を次に示します。

 0   1   2   3
 a  (b) (c) (d)
(b) (c) (d)  e

added3そしてremovedです0

于 2013-06-26T10:03:52.520 に答える
3
  1. addedArray = newArray ∖ (newArray ∩ oldArray)

           = newArray ∖ ({@"a",@"c",@"d",@"e",@"f",@"h"} ∩ {@"a",@"b",@"d",@"e",@"g"}) 
           = newArray ∖ {@"a",@"d",@"e"}            
           = {@"a",@"c",@"d",@"e",@"f",@"h"} ∖ {@"a",@"d",@"e"}
           = {@"c",@"f",@"h"}             
    
  2. removedArray = oldArray ∖ (oldArray ∩ newArray)

             = oldArray ∖ ({@"a",@"b",@"d",@"e",@"g"} ∩ {@"a",@"c",@"d",@"e",@"f",@"h"})
             = oldArray ∖ {@"a",@"d",@"e"}
             = {@"a",@"b",@"d",@"e",@"g"} ∖ {@"a",@"d",@"e"}
             = {@"b",@"g"}
    

配列の交差を見つけるには、次の SO 投稿を表示できます: Finding Intersection of NSMutableArrays

于 2013-06-26T09:40:19.210 に答える