我正在尋找一種在已排序串列中添加元素或移動現有元素的方法。
data class House(
val id: Int,
val sold: Boolean,
val creationDate: LocalDate,
...
)
我的串列已經按 2 個引數(sold 和 creationDate)排序。
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, ...)
]
現在,如果出售了房屋(房屋 ID 為 789),我如何將專案從串列的第一部分移動到另一部分而不重新排序所有串列。(出于性能考慮)這個新職位必須考慮關鍵的“creationDate”。
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, ...)
]
謝謝你的幫助。
uj5u.com熱心網友回復:
假設你有:
val list = mutableListOf<House>(
...
)
val indexToMove = 2
您可以先洗掉該元素,然后使用二進制搜索查找應插入的位置。binarySearch如果找不到元素,將回傳 (-insertion point - 1)。如果串列中恰好有相同的元素,我們將使用該元素的索引作為插入點。
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)
uj5u.com熱心網友回復:
基于您的串列已經排序的假設,您可以從串列中洗掉房屋,然后將其重新插入到正確的位置。已售房屋必須插入到您要插入的房屋之后的第一所房屋的索引處。
在這種情況下,您正在尋找已售出且創建日期早于您剛售出的房屋的第一套房子:
val index = houseList.indexOfFirst {
it.sold && it.creationDate < soldHouse.creationDate
}
從串列中洗掉房屋并將其轉換為已售房屋,這給出了
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()})
哪個列印
old house list:
123, 456, 789, 147, 258, 369, 321, 654
new house list:
123, 456, 147, 258, 369, 321, 789, 654
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/405344.html
標籤:
下一篇:批量資料的嵌套陣列排序
