Оператор удалить предыдущий элемент из коллекции в kotlin? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть следующий список:

val headersAndContent = mutableListOf(..., Pair(1, "header"), Pair(2, "header"), Pair(3, "content for 2"), ...)

Я хотел бы удалить все элементы типа header, за которыми не следует элемент содержимого.

Таким образом, при применении такого оператора список результатов будет выглядеть так:

(..., Pair(2, "header"), Pair(3, "content for 2"), ...)

Интересно, существует ли такой оператор?

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Ответ @Francesc обеспечивает хороший практический подход к решению вашей проблемы.Однако, если вы (или кто-либо еще) хотели бы найти решение в более функциональной парадигме программирования, рассмотрите этот код

typealias CustomData = Pair<Int, String>

private fun CustomData.isHeader() = second == "header"
private fun CustomData.isContent() = !isHeader()

fun dropUnwantedHeaders(data: List<CustomData>) =
    data.asSequence()
    // add a duplicate of the last element to the list. this is an easy way in this case to deal with the problem that the map operation
    // is not the exact inverse of the zipWithNext operation
    .plusElement(data.last())
    // combine each element with the one after it since the filter predicate depends on both
    .zipWithNext()
    .filterNot { (elem, nextElem) ->
        // drop element if it is a header and the subsequent element is not content
        elem.isHeader() && !nextElem.isContent()
    }
    // undo the previous zip operation. this results in dropping the last element of the list
    .map { it.first }
    .toList()

fun main() {
    val unfilteredData = listOf(Pair(1, "header"), Pair(2, "header"), Pair(3, "content for 2"))
    val expectedResult = listOf(Pair(2, "header"), Pair(3, "content for 2"))
    assert(dropUnwantedHeaders(unfilteredData) == expectedResult)
}
0 голосов
/ 09 июля 2019

Примерно так:

list.removeAll {
    val index = list.indexOf(it)
    "header" == it.second && index < list.size - 1 && "content" == list[index + 1].second 
}

Возможно, вам придется настроить флажок "is content".

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