Как отсортировать элементы так, чтобы я тратил наименьшее количество места на каждую строку UICollectionView? - PullRequest
1 голос
/ 08 октября 2019

Рассмотрим следующий снимок экрана:

enter image description here

Предположим, мы знаем эту информацию о наших элементах collectionView и максимальной ширине каждой строки:

let maxRowWidth = UIScreen.main.bounds.width - 40//the width of the screen minus the collectionView insets

let items = [(text: "Lululemon", width: 98.955), (text: "boots", width: 67.47), (text: "sweaters", width: 89.61), (text: "Gymshark", width: 96.72), (text: "Free People", width: 110.325), (text: "dress", width: 66.18), (text: "air force 1", width: 93.53999999999999), (text: "Athleta", width: 77.205), (text: "dresses", width: 81.6), (text: "Brandy Melville", width: 131.49), (text: "Princess Polly", width: 121.41), (text: "formal dress", width: 111.88499999999999), (text: "jeans", width: 65.265), (text: "booties", width: 79.365), (text: "Ray-Ban", width: 84.78), (text: "cheetah print", width: 117.61500000000001), (text: "skirt", width: 57.975), (text: "mom jeans", width: 102.31499999999998), (text: "Revolve", width: 82.57499999999999), (text: "Patagonia", width: 96.27)]
let horizontalSpaceBetweenItems:CGFloat = 9

Я пытаюсь придумать алгоритм, который позволит мне сортировать элементы таким образом, чтобы я мог минимизировать количество пустого пространства для каждой строки. Например, на скриншоте, если я поменяю «джинсы» на «Эти три бутика», то у 4-й строки будет меньше свободного места.

Как найти перестановку массива items таким образом, чтобы в collectionView было наименьшее количество пустого пространства?

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

1 Ответ

2 голосов
/ 09 октября 2019

Что вам нужно, так это проблема упаковки бункера: https://en.wikipedia.org/wiki/Bin_packing_problem

Ваши строки - это, по сути, ячейки фиксированного объема, и вы стремитесь достичь минимально возможного набора корзин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...