从另一个NSMutableArray(iOS)向NSMutableArray添加对象

时间:2016-08-08 16:41:11

标签: objective-c nsmutablearray

我有NSMutableArray(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;
}, {
   "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.

然后,我有第二个NSMutableArray(ArrayTwo)结构,就像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;
})

..除了ArrayTwo中可包含的最大对象数为3。

现在,我想做的是......

  • 将ArrayTwo的对象添加到ArrayOne中(请记住,ArrayOne最多只能容纳10个对象)
  • 保持前5个对象按键排序" item_image_vote" (不应更换前五个投票对象)
  • 如果需要替换ArrayOne中的任何对象,则键值为#34; item_image_timeStamp"应首先更换。(最旧的物体将首先被替换。后面是第二个最旧的物体。)

我希望我没有让我的问题太混乱。提前谢谢。

2 个答案:

答案 0 :(得分: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))];

答案 1 :(得分:0)

  

是......正是你所说的......最后一个数组意味着包含(a)First的原始前5名,(b)所有Second,以及(c)First中最年轻的遗留项目适合

只需逐步完成您的要求:

  1. 如果First&中的商品数量第二个组合是< = 10 just join。

  2. "来自First"的原始前5名 - 按投票计数排序第一,您可以使用基于函数,块或描述符的排序。复制前5个(由于[1]必须至少有5个,因此这里不需要检查)项目是你的结果。

  3. "所有Second" - 在结果中附加Second元素。您现在的结果中有6-8项。

  4. 从[2]中复制已排序的第一个项目6,然后按年龄对结果数组进行排序。根据需要将前2-4项添加到结果中。

  5. 以上所有内容均可使用标准NSArray方法进行排序,复制和追加,

    HTH