2016-08-08 130 views
0

我有一個NSMutableArray(ArrayOne)結構類似,從而..從另一個的NSMutableArray(IOS)將對象添加到的NSMutableArray

({ 
    "item_image_timeStamp" = "492364855.234597"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 123; 
}, { 
    "item_image_timeStamp" = "492364458.236597"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 456; 
}, { 
    "item_image_timeStamp" = "492364179.052397"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 6184; 
}, { 
    "item_image_timeStamp" = "492364789.004447"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 64; 
}, { 
    "item_image_timeStamp" = "492364356.002341"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 3778; 
}) 

可以包含在ArrayOne對象的最大數目是10。

然後,我有結構就像ArrayOne

({ 
    "item_image_timeStamp" = "492364855.234597"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 123; 
}, { 
    "item_image_timeStamp" = "492364458.236597"; 
    "item_image_url" = "sample url"; 
    "item_image_vote" = 456; 
}) 

..except第二NSMutableArray(ArrayTwo)的對象,可以是CON的最大數目tained在ArrayTwo是3

現在,我想要做的是..

  • 添加ArrayTwo物體插入ArrayOne(牢記ArrayOne只能容納最多10個對象的)
  • 保留按鍵「item_image_vote」排序的前5個對象
  • 如果需要替換ArrayOne中的任何對象,應該先替換鍵爲「item_image_timeStamp」的最低值的項目。 (最早的對象將被替換爲第一個..接着第二個最早的對象)。

我希望我沒有讓我的問題太混亂。先謝謝你。

+0

你嘗試過什麼?此外,你的算法還不完全清楚 - 最終數組意味着包含(a)來自First的原始前5位,(b)所有的第二位,以及(c)First中將保留的項目中最年輕的項目嗎?或者是在第二個條目中執行的算法,即添加來自第二個的第二個可能會從第二個彈出剛添加的第一個? – CRD

+0

是的......完全是你說的......最後一個數組意味着包含(a)來自First的原始前5個,(b)所有的第二個,以及(c)第一個中的最小的剩餘項目,其將適合 –

回答

0

添加,刪除和測量長度都是可變數組上的所有方法,可以直接應用。問題的有趣部分是排序標準,通過NSSortDescriptor得到很好的解決。

NSArray允許應用這些在sortedArrayUsingDescriptors(注意複數)的羣體。所以一個好的方法是添加數組,根據您的條件進行排序並截斷到最大長度。

// sort on vote, descending 
NSSortDescriptor *voteDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"item_image_vote" ascending:NO]; 

// sort on date, descending 
NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"item_image_timeStamp" ascending:NO]; 

NSMutableArray *bigArray = [ArrayOne mutableCopy]; // note: lowercase variable names is considered preferable style 
[bigArray addObjectsFromArray:ArrayTwo]; 

[bigArray sortUsingDescriptors:@[voteDescriptor, dateDescriptor]]; 
// note: order matters. you want votes sorted first, ties broken with date 

結果是現在排序的bigArray被截斷爲最大尺寸。

NSArray *result = [bigArray subarrayWithRange:NSMakeRange(0, MIN(10, bigArray.count))]; 
+0

您將以最低的投票方式取消最老的投票,而不是最高的投票,而不是最高的投票 - 這正是問題所說的我認爲的問題。然而,問題中的算法並不精確,你可能已經實現了OP所期望的,但是沒有正確描述...... – CRD

+0

對不起。這不會工作..最終的數組意味着包含(a)原始頂部(b)全部第二個,以及(c)第一個中最小的任何遺留物品 –

0

Yes..exactly你said..the最終數組是指含有一,(二)所有第二次的,以及(c)中最小的任何(一)原前5名留在第一項,將適合

通過你們的要求工作步驟:

  1. 如果合併項目中首先&二數爲< = 10加入。

  2. 「原來的First 5」 - Sort by count count,您可以使用基於功能,塊或描述符的排序。複製前5個(因爲[1]必須至少有5個,所以這裏不需要檢查)項目是你的結果。

  3. 「all of Second」 - 將第二個元素追加到結果中。您的結果中現在有6-8項。

  4. 從排序後的第一個[2]開始複製項目6並按年齡對結果數組進行排序。根據需要將第2-4項添加到結果中。

上述所有可以用標準NSArray方法排序,複製和附加來完成,

HTH

相關問題