Estoy buscando una forma de agregar un elemento en una lista ya ordenada o mover un elemento existente.
data class House( val id: Int, val sold: Boolean, val creationDate: LocalDate, ... )Mi lista ya está ordenada en 2 parámetros (vendido y fecha de creación).
Example of a list already sorted : [ House(123, false, 2015-03-23, ...), House(456, false, 2015-01-11, ...), House(789, false, 2014-08-30, ...), // <- I'm looking for move this one House(147, false, 2014-02-15, ...), House(258, true, 2016-06-02, ...), House(369, true, 2015-04-20, ...), House(321, true, 2015-01-28, ...), House(654, true, 2011-11-01, ...) ]Ahora bien, si se vende una casa (casa con id 789), ¿cómo puedo mover un elemento de la primera parte de la lista a la otra parte sin reordenar toda la lista? (por un problema de rendimiento) Esta nueva posición debe considerar la clave "fecha de creación".
List updated : [ House(123, false, 2015-03-23, ...), House(456, false, 2015-01-11, ...), House(147, false, 2014-02-15, ...), House(258, true, 2016-06-02, ...), House(369, true, 2015-04-20, ...), House(321, true, 2015-01-28, ...), House(789, true, 2014-08-30, ...), // <- Result expected House(654, true, 2011-11-01, ...) ]Gracias por tu ayuda.
Suponiendo que su lista ya está ordenada, puede eliminar la casa de la lista y volver a insertarla en el lugar correcto. La casa vendida debe insertarse en el índice de la primera casa que debe ir después de la casa que desea insertar.
En este caso, está buscando la primera casa que se vende y tiene una fecha de creación anterior a la casa que acaba de vender:
val index = houseList.indexOfFirst { it.sold && it.creationDate < soldHouse.creationDate }Al eliminar la casa de la lista y convertirla en una casa vendida, esto da
val houseList = mutableListOf( House(123, false, LocalDate.of(2015, 3, 23)), House(456, false, LocalDate.of(2015, 1, 11)), House(789, false, LocalDate.of(2014, 8, 30)), House(147, false, LocalDate.of(2014, 2, 15)), House(258, true, LocalDate.of(2016, 6, 2)), House(369, true, LocalDate.of(2015, 4, 20)), House(321, true, LocalDate.of(2015, 1, 28)), House(654, true, LocalDate.of(2011, 11, 1)) ) println("old house list:") println(houseList.joinToString(", ") {it.id.toString()}) val houseToSell = houseList.firstOrNull { it.id == 789 } ?: return houseList.remove(houseToSell) val soldHouse = houseToSell.copy(sold = true) val index = houseList.indexOfFirst { it.sold && it.creationDate < soldHouse.creationDate } if (index == -1) houseList.add(0, soldHouse) else houseList.add(index, soldHouse) println("new house list:") println(houseList.joinToString(", ") {it.id.toString()})que imprime
old house list: 123, 456, 789, 147, 258, 369, 321, 654 new house list: 123, 456, 147, 258, 369, 321, 789, 654Supongamos que tiene:
val list = mutableListOf<House>( ... ) val indexToMove = 2 Primero puede eliminar el elemento y luego usar una búsqueda binaria para encontrar dónde debe insertarse. binarySearch devolvería (-punto de inserción - 1) si no se encuentra el elemento. Y si el mismo elemento está en la lista, solo usaremos el índice de ese elemento como punto de inserción.
val removed = list.removeAt(indexToMove) removed.sold = true // shouldn't "sold" be a var if a house can be sold? // this should be the same comparator you used for sorting the list val comparator: Comparator<House> = compareBy(House::sold) .thenByDescending(House::creationDate) val searchResult = list.binarySearch(removed, comparator) val insertionPoint = if (searchResult < 0) { -(searchResult + 1) } else { searchResult } list.add(insertionPoint, removed)