1

編集: 大幅な編集、混乱を招いて申し訳ありません!

私は現在、2 つの異なる方法を使用して JSON WebService から 2 つの配列を取得するアプリに取り組んでいます。

最初の配列では、ローカルの在庫を取得します。2 番目の配列では、サプライヤーの在庫を取得します。

私は画像がよりよく説明すると思いますが:

私の素晴らしいアプリケーション図

そのため、Web サービスは多数のアイテムを取得します。配列 1 にはローカル在庫のアイテムが含まれ、配列 2 にはサプライヤーからのアイテムが含まれ、説明などの情報が追加されます。両方の配列をマージして、ローカルの在庫配列 1 内の既存のアイテムをサプライヤー在庫配列 2 内のアイテムの説明で更新したいと思います。

これが私が達成しようとしていることの例です。すべての製品は一意の識別子プロパティ (例には記載されていません) によって識別され、それを補うために isEqual と hash をオーバーライドしました。商品の ID が類似している場合、同等と見なされます。

**Product**

@property id *internalID;
@property id *externalID ;
@property id *localStock;
@property id *supplierStock;
@property id *image;
@property id *productInfo;

Webservice 13 つの製品が返されるようになりました。

製品 1

*internalID = ABCDEF
*externalID = (null)
*localStock = 15
*supplierStock = (null)
*image = (null)
*productInfo = (null);

製品 2

*internalID = GHIJK
*externalID = (null)
*localStock = 13
*supplierStock = (null)
*image = niceImage.png
*productInfo = @"This Product is Awesome!";

製品 3

*internalID = LMNOP
*externalID = (null)
*localStock = 7
*supplierStock = (null)
*image = (null)
*productInfo = (null);

Webservice 24 つの製品を返します。そのうちの 2 つは配列 1 にも含まれています。

製品 1

    *internalID = (null)
    *externalID = 123456
    *localStock = (null)
    *supplierStock = 12
    *image = external_product1image.jpg
    *productInfo = @"This product is also Awesome and in both local stock and supplier stock!";

製品 4

    *internalID = (null)
    *externalID = 23456
    *localStock = (null)
    *supplierStock = 11
    *image = niceImage.png
    *productInfo = @"This Product is Awesome and only available from our supplier!";

製品 3

    *internalID = (null)
    *externalID = 78901
    *localStock = (null)
    *supplierStock = 7
    *image = external)supplierimage.jpg
    *productInfo = @"This product is also Awesome and in both local stock and supplier stock!";

次に、次のmergedArrayようになります。

製品 1

*internalID = ABCDEF
*externalID = 123456
*localStock = 15
*supplierStock = 12
*image = external_product1image.jpg
*productInfo = @"This product is also Awesome and in both local stock and supplier stock!";

//したがって、配列 1 の製品 1 は、そのプロパティを配列 2 の製品 1 とマージしました

製品 2

*internalID = GHIJK
*externalID = (null)
*localStock = 13
*supplierStock = (null)
*image = niceImage.png
*productInfo = @"This Product is Awesome!";

製品 3

*internalID = LMNOP
*externalID = 78901
*localStock = 7
*supplierStock = 7
*image = external)supplierimage.jpg
*productInfo = @"This product is also Awesome and in both local stock and supplier stock!";

製品 4

*internalID = (null)
*externalID = 23456
*localStock = 13
*supplierStock = 11
*image = niceImage.png
*productInfo = @"This Product is Awesome and only available from our supplier!";

これは私が使用したコードですが、どういうわけか時々グリッチアウトするようです:

- (void) compareArrays:(id)sender metBreedte:(NSString *)breedte metHoogte:(NSString *)hoogte metDiameter:(NSString *)diameter
{
    NSMutableSet *getBandenSet = [NSMutableSet setWithArray:getBandenArray];      NSUInteger i = 0;

    while (i < [getBandenInfo1Array count]) {
        id getBandenInfo1Object = [getBandenInfo1Array objectAtIndex:i];
        if ([getBandenSet containsObject:getBandenInfo1Object])

        {

            BWBand *getBandenBand = [getBandenSet member:getBandenInfo1Object];

            BWBand *getBandenInfo1Band = getBandenInfo1Object;

            // Do stuff to the Banden (sync)
            getBandenBand.alternatievePrijs = getBandenInfo1Band.alternatievePrijs;
            getBandenBand.itemName = getBandenInfo1Band.itemName;
            getBandenBand.supplierStock = getBandenInfo1Band.supplierStock;
            getBandenBand.grossPrice = getBandenInfo1Band.grossPrice;
            getBandenBand.eancode = getBandenInfo1Band.eancode;
            getBandenBand.EMarked = getBandenInfo1Band.EMarked;
            getBandenBand.garagePrijs = getBandenInfo1Band.garagePrijs;
            getBandenBand.loadIndex = getBandenInfo1Band.loadIndex;
            getBandenBand.brand = getBandenInfo1Band.brand;
            getBandenBand.custPrice = getBandenInfo1Band.custPrice;
            getBandenBand.netPrice = getBandenInfo1Band.netPrice;
            getBandenBand.tyreLabel = getBandenInfo1Band.tyreLabel;
            getBandenBand.TyreLabelFuel = getBandenInfo1Band.TyreLabelFuel;
            getBandenBand.TyreLabelNoise = getBandenInfo1Band.TyreLabelNoise;
            getBandenBand.TyreLabelNoiseLevel = getBandenInfo1Band.TyreLabelNoiseLevel;
            getBandenBand.TyreLabelWet = getBandenInfo1Band.TyreLabelWet;
            getBandenBand.foto = getBandenInfo1Band.foto;
            NSMutableString *string1 = [NSMutableString stringWithString: getBandenBand.colorStock];
            NSString *newString = [string1 substringToIndex:[string1 length]-2];
            NSString *colorStock = [NSString stringWithFormat:@"%@-%@",newString,getBandenInfo1Band.supplierStock];
            getBandenBand.colorStock = colorStock;
           [getBandenSet removeObject:getBandenInfo1Object];
            [getBandenInfo1Array removeObjectIdenticalTo:getBandenInfo1Object];
        } else
        {i++;}

        mergedBandenArray = [NSMutableArray arrayWithArray:[getBandenArray arrayByAddingObjectsFromArray:getBandenInfo1Array]];
       [mergedBandenArray sortUsingDescriptors:
         [NSArray arrayWithObjects:
          [NSSortDescriptor sortDescriptorWithKey:@"colorStock" ascending:NO], [NSSortDescriptor sortDescriptorWithKey:@"brand" ascending:YES], nil]];}

これはすべて NSPredicates を使用して実行できますか? もしそうなら、どのように?

前もって感謝します!

4

2 に答える 2

4

isEqual次のアルゴリズムでは、クラスhashに対してオーバーライドする必要はありません。Product

  • まず、キーに従って両方の配列uniqueItemIDを昇順で並べ替えます。
  • 次に、両方のアレイを並行してトラバースし、両方のアレイから宛先アレイに製品を追加またはマージします。

両方の配列がソートされている場合、単一のループが両方の配列を並行してトラバースすることで、一致する製品と一致しない製品を簡単に見つけることができます。

次のコードは、うまくいけばアイデアを示しています。

NSSortDescriptor *sortByID = [NSSortDescriptor sortDescriptorWithKey:@"uniqueItemID" ascending:YES];
NSArray *sorted1 = [array1 sortedArrayUsingDescriptors:@[sortByID]];
NSArray *sorted2 = [array2 sortedArrayUsingDescriptors:@[sortByID]];

NSUInteger i1 = 0, i2 = 0;
NSMutableArray *combined = [NSMutableArray array];
while (i1 < [sorted1 count] && i2 < [sorted2 count]) {
    Product *p1 = sorted1[i1];
    Product *p2 = sorted2[i2];
    switch ([p1.uniqueItemID compare:p2.uniqueItemID]) {
        case NSOrderedAscending:
            // p1 is in first array, but not in second:
            [combined addObject:p1];
            i1++;
            break;
        case NSOrderedDescending:
            // p2 is in second array, but not in first:
            [combined addObject:p2];
            i2++;
            break;
        case NSOrderedSame:
            // p1, p2 have same ID:
            ... update p1 with values from p2 ...
            [combined addObject:p1];
            i1++, i2++;
            break;
    }
}
// Add remaining products from first array:
while (i1 < [sorted1 count]) {
    [combined addObject:sorted1[i1]];
    i1++;
}
// Add remaining products from second array:
while (i2 < [sorted2 count]) {
    [combined addObject:sorted2[i2]];
    i2++;
}
于 2013-02-21T19:47:41.743 に答える
3

1)。両方のアレイをマージするには:

NSMutableSet * set = [NSMutableSet setWithArray:array1];
[set addObjectsFromArray:array2];

NSArray * array = [set allObjects];

2)。NSPredicatesを使用して重複を削除するには:

1.述語を使用した楽しみのフィルタリング

2.こんにちは、NSPredicate

3)。重複をマージして削除するには:

NSArray * array1、* array2;
MSMutableArray * result = [array1 mutableCopy];
for(array2のidオブジェクト)
{{
  [結果removeObject:object]; //重複がすでに存在する場合は、重複を削除します。
  [結果addObject:object];
}
于 2013-01-23T13:24:10.437 に答える