Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

124
Vistas
Agregar o mover un elemento en una lista ya ordenada

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.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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, 654
over 4 years ago · Santiago Trujillo Denunciar

0

Supongamos 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)
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda