Краткое решение для поиска индексов

Функция фильтрует индексы одинаковых лет в одном массиве из другого.

Я ищу более короткое решение моего кода:

 let years = (2015...2025).map { $0 }
 var chosenYears = [2015, 2019, 2016] (example)

Эта функция делает то, что я хочу, но я кое-что ищу (посмотрите больше на functional-programming).

 func selectChoseYears() {
    for (index, year) in years.enumerated() {
        for chosenYear in chosenYears {
            if year == chosenYear { view?.selectCell(at: index) }
        }
    }
 }

Я пробовал некоторые решения, но они выглядят уродливее и длиннее этого.

Спасибо.

Поиск «короче» в программировании — первая ошибка. Вы всегда должны искать «читабельнее» или «проще», а не «короче».

Sulthan 29.01.2019 11:36

@Султан прав. Вы также должны учитывать «эффективность», когда речь идет о коллекциях и перечислениях.

Mojtaba Hosseini 29.01.2019 11:56
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
2
104
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

пытаться :

let result = (2015...2025).map { $0 }.filter { [2015, 2019, 2016].contains($0)}

Это даже не компилируется... Вы имели в виду [2015,2019,2016].contains($0)? Кстати, нет необходимости вызывать map на Range, чтобы преобразовать его в Array, Array(2015...2025) работает просто отлично.

Dávid Pásztor 29.01.2019 11:48
Ответ принят как подходящий

Есть много возможных решений, например:

let yearIndices = chosenYears.compactMap { years.index(of: $0) }
for yearIndex in yearIndices {
   view?.selectCell(at: yearIndex)
}

или просто

for (index, year) in years.enumerated() where chosenYears.contains(year) {
    view?.selectCell(at: index)
}

Хорошее решение. Спасибо!

vpoltave 29.01.2019 12:03

Кроме того, можно подумать о том, чтобы сделать chosenYearsSet вместо массива. Это сделало бы второе решение еще более эффективным.

Martin R 29.01.2019 12:56

Вы можете попробовать что-то вроде этого:

self.tableView.visibleCells
.flatMap { $0 as? MyCell }
.forEach { $0.updateView(isSelected: chosenYears.contains($0.viewModel?.year) }

Хотя для этого требуется, чтобы в ячейках хранилась модель представления с указанием года, который она представляет, и вам необходимо реализовать updateView(isSelected:)

Вы можете напрямую фильтровать indices

years.indices.filter{ chosenYears.contains(years[$0]) }.forEach { view?.selectCell(at: $0) }

Я полностью согласен с комментарием Султана. Однако я бы заменил более читаемый и проще на более эффективным.

Спасибо. Мне тоже нравится это решение!

vpoltave 29.01.2019 13:18

Вы можете найти индексы любых элементов Equatable с помощью следующей функции

- Общий поиск индекса

func indexes<T: Equatable>(of chosen: [T], in all: [T]) -> [Int] {
    return all.enumerated().filter { chosen.contains($0.element) }.map { $0.offset }
}

- Использование:

indexes(of: chosenYears, in: years)

Зачем именно вам нужен Comparable?

Sulthan 29.01.2019 11:59
contains() должен сравнивать элементы. Но ты снова прав. Отредактировано с лучшим выбором. ;)
Mojtaba Hosseini 29.01.2019 12:01

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