Swift: сколько одинаковых объектов в массиве

У меня есть CollectionView с такими элементами, как...

Fruit(name: String, price: Int, imageUrl: String)

Пользователь может выбрать несколько Fruits, а затем перейти к «кассе», которая представляет собой UITableView все выбранные фрукты. UITableViewCell содержит: amountLabel, fruitLabel, priceLabel.

Я хочу показать, сколько каждого фрукта и общая цена в этом представлении.

Как лучше всего это сделать?

Что я вижу сейчас:

Banana - 1$
Orange - 3$
Banana - 1$
Apple - 2$
Apple - 2$
Banana - 1$
Orange - 3$
Orange - 3$

total: 16$

Что я хочу увидеть:

3x Banana - 3$
2x Apple - 4$
3x Orange - 9$

total: 16$

Вы должны обернуть свой Fruit в структуру Order вместе со счетчиком int, который вы увеличиваете, когда тот же самый фрукт добавляется вместо хранения отдельного фрукта. Затем вы также можете иметь вычисляемое свойство в структуре Order, которое возвращает общую сумму. Объекты Order могут храниться в словаре с фруктом или названием фрукта в качестве ключа.

Joakim Danielson 28.05.2019 10:49

@JoakimDanielson, он хочет сделать это с этим источником данных. Это его вопрос.

Rakesha Shastri 28.05.2019 10:49

@RakeshaShastri Я разместил это как комментарий, а не как ответ, который сильно отличается, поэтому я думаю, что мне разрешено представить альтернативный маршрут для рассмотрения OP.

Joakim Danielson 28.05.2019 10:54
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
3
101
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это идеальный случай для NSCountedSet.

Вы можете увидеть документацию для NSCountedSet здесь.

Вы можете создать NSCountedSet лайк...

let countedSet = NSCountedSet(array: fruits)

а затем получить информацию из него, как ...

countedSet.objectEnumerator.forEach {
    let count = countedSet.count(for: $0)

    print($0.name, count, count * $0.price)
}

Для просмотра таблицы вы можете использовать countedSet.objectEnumerator.allObjects.count для количества строк.

Можете ли вы использовать это как источник данных для табличного представления?

Rakesha Shastri 28.05.2019 10:49

Ok. Позвольте мне перефразировать. Может ли он использовать это, чтобы табличное представление отображало результат так, как он хочет? (Его последняя часть вопроса)

Rakesha Shastri 28.05.2019 10:50

Я спрашиваю, будет ли это работать как источник данных для представления таблицы, чтобы легко достичь требуемого формата результата?

Rakesha Shastri 28.05.2019 10:52
Ответ принят как подходящий

Вы можете сгруппировать массив и просуммировать цены

let grouped = Dictionary(grouping: fruits, by: {$0.name})
var total = 0
for (key, value) in grouped {
    let price = value.reduce(0, {$0 + $1.price})
    print(value.count, key, "\(price)$")
    total += price
}
print("total: \(total)$")

Ах да, я знал, что есть альтернатива Swifty NSCountedSet, но я не мог вспомнить, что это было. Это лучший ответ, чем мой :)

Fogmeister 28.05.2019 10:52

Это был отличный ответ. Извините за поздний ответ, но я пытался заполнить ячейки предоставленной информацией. Я создал новый класс FilteredFruits() и новый массив [filteredFruits](), а после print(value.count... я также сделал filteredFruits.append(Fruit(amount: value.count, name: key, price: price) , а затем заполнил ячейки filteredFruits[indexPath.row].name и т. д. Это правильный способ продолжить? Спасибо

maniponken 28.05.2019 11:49

Если это то, что вы ожидаете, то да.

vadian 28.05.2019 11:54

Другие вопросы по теме