Есть ли более эффективный способ отображения списка элементов в список пар определенным образом? - PullRequest
1 голос
/ 19 марта 2020

исходные данные: массив

целевые возвращаемые данные: список >

Исходные данные (Массив ) содержат список jpegs книги в виде (Scan0001.jpg, Scan0002.jpg, ..., Scan000n.jpg). Первый файл (Scan0001.jpg) всегда является передней обложкой книги, а последний файл (Scan000n.jpg) всегда является задней обложкой книги. Переменные файлы в следующем фрагменте кода являются массивом который содержит только файлы JPEG в виде Scanxxxx.jpg.

Я хочу создать пары файлов страниц со следующими правилами:

1) Обложки (спереди, сзади) всегда должна быть пара (Файл Scan0001.jpg, Scan000n.jpg соответственно)

2) Если неперекрывающие страницы неровные (имеется в виду, что на последней странице нет пары), то должна быть пара (Файл Scan000n-1.jpg)

3) Передняя обложка всегда должна быть первой парой файлов, а задняя обложка всегда должна быть последней

Следующий код работает, но я чувствую себя там пространство для совершенствования с точки зрения более эффективного или более чистого кода

val files = selectedFolder.listFiles()
val preliminaryResult = files.toMutableList()
val result = mutableListOf<Pair<File?,File?>>()

result.add(Pair(preliminaryResult.first(),null))
preliminaryResult.removeAt(0)

result.add(Pair(preliminaryResult.last(),null))
preliminaryResult.removeAt(preliminaryResult.size-1)

result.addAll(preliminaryResult.map{
    if(preliminaryResult.indexOf(it) % 2 == 0) {
        Pair(it,preliminaryResult.getOrNull(preliminaryResult.indexOf(it)+1))
    } else {
        Pair(null,null)
    }
})

result.removeAll{
    it == Pair(null,null)
}

result.add(result[1])
result.removeAt(1)

1 Ответ

1 голос
/ 19 марта 2020

Вы можете сначала вставить нужные значения, чтобы вы могли использовать zipWithNext без перерыва.

val result = selectedFolder.listFiles().toMutableList<File?>().apply {
    add(1, null) // for front cover
    if (0 == size % 2)
        add(size - 1, null) // for odd inner last page
    add(null) // for back cover
}.zipWithNext()
    .run { slice(indices step 2) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...