2016-08-08 3 views
0

У меня есть NSMutableArray (ArrayOne) структурирована как так ..Добавить объекты в NSMutableArray из другого NSMutableArray (IOS)

({ 
    "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; 
}) 

..except, что максимальное количество объектов, которые могут быть мошенниками tained в ArrayTwo равно 3.

Теперь, что я хочу сделать, это ..

  • добавить объекты ArrayTwo в ArrayOne (имея в виду, что ArrayOne может содержать только максимум 10 объектов)
  • сохраняйте 5 лучших объектов, отсортированных по ключу «item_image_vote» (верхний пятый проголосовавший объект не должен быть заменен)
  • Если какие-либо объекты в ArrayOne необходимо заменить, сначала следует заменить элемент с наименьшим значением для ключа «item_image_timeStamp». (старейший объект будет заменен первым ... после второго старейшего).

Надеюсь, я не задал свой вопрос слишком запутанным. Заранее спасибо.

+0

Что вы пробовали? Кроме того, ваш алгоритм не совсем ясен - последний массив должен содержать (а) исходный верх 5 из первых, (б) все второй и (в) самый младший из оставшихся предметов в Первом, который подойдет? Или алгоритм, выполняемый для каждой записи во втором, т. Е. Добавление второго из второго может вывести только что добавленное 1-е из второго? – CRD

+0

Да ... то, что вы сказали ... окончательный массив должен содержать (а) исходный верх 5 из первых, (б) все второй и (в) самый младший из всех остатков в Первом, который будет соответствовать –

ответ

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

Вы удаляете старейший с самым низким голосом, а не самым старым с не лучшим 5-м голосом - вот что задает вопрос, я думаю. Однако алгоритм в вопросе не является точным, и вы могли бы реализовать то, что желает OP, но не описывали правильно ... – CRD

+0

Извините .. это не работает. Последний массив должен содержать (a) оригинальную вершину 5 из первых, (б) все Второе и (в) самый младший из всех остатков в Первом, который будет соответствовать –

0

Yes..exactly что вы said..the окончательный массив предназначен, чтобы содержать (а) оригинальный топ 5 из первых, (б) все Во-вторых, и (с) самый младший из любого остается пунктов в первых, которые будут соответствовать

Просто работа по вашему требованию ступенчато:

  1. Если количество элементов в первый & Второй комбинированный является < = 10 просто присоединяйтесь.

  2. «Первоначальная верхняя часть 5 от первого» - Сортировка Сначала по подсчету голосов вы можете использовать сортировку с помощью функции, блока или дескриптора. Скопируйте первые 5 (должно быть не менее 5 из-за [1], поэтому здесь не требуется проверка), чтобы стать вашим результатом.

  3. «все вторые» - добавьте элементы Второго к вашему результату. Теперь у вас есть 6-8 предметов.

  4. Скопируйте пункты 6 и после сортировки Сначала из [2] и отсортируйте полученный массив по возрасту. Приложите первые 2-4 элемента по мере необходимости к вашему результату.

Все вышесказанное можно сделать с помощью стандартных NSArray методов сортировки, копирования и добавления,

HTH

Смежные вопросы