不像其他人,我會假設你想,因爲你提一個關於指數重新編號關注做你的就地工作。如果排序是所有你關心的則
1)堅持指數以移出到設定的,而不是一個列表恆定的時間查找。取決於索引的範圍,散列集合或位集合似乎是合適的。 2)以相反的順序移動列表緩衝區,刪除要刪除集合中的索引。
scala> val buffer = ListBuffer("a", "b", "c", "d", "e")
buffer: scala.collection.mutable.ListBuffer[java.lang.String] = ListBuffer(a, b, c, d, e)
scala> val indicesToDelete = BitSet(4, 1)
indicesToDelete: scala.collection.mutable.BitSet = BitSet(1, 4)
scala> for (i <- (buffer.size -1) to 0 by -1) if (indicesToDelete contains i) buffer remove i
scala> buffer
res19: scala.collection.mutable.ListBuffer[java.lang.String] = ListBuffer(a, c, d)
請注意,儘管這會刪除n log n種指數,但這並不會使其成爲線性算法。就地刪除類似數組的結構並不便宜。更高的指數必須在每次刪除時向下複製。
要獲得指數的線性刪除,您需要做更多的工作,您需要1)根據您迄今爲止刪除的數字向前複製未刪除的元素。完成後2)刪除前n個元素,其中n是您刪除的數字。
scala> val buffer = ListBuffer("a", "b", "c", "d", "e")
buffer: scala.collection.mutable.ListBuffer[java.lang.String] = ListBuffer(a, b, c, d, e)
scala> val indicesToDelete = BitSet(4, 1)
indicesToDelete: scala.collection.mutable.BitSet = BitSet(1, 4)
scala> var deleted = 0
deleted: Int = 0
scala> for (i <- 0 until buffer.size)
| if (indicesToDelete contains i) {
| deleted += 1
| } else if (deleted > 0) {
| buffer(i - deleted) = buffer(i)
| }
scala> }
scala> buffer trimEnd deleted
scala> buffer
res0: scala.collection.mutable.ListBuffer[java.lang.String] = ListBuffer(a, c, d)
從描述中不清楚您是要創建一個新的ListBuffer還是改變現有的ListBuffer。這將對需要編寫的代碼風格產生巨大影響。迄今爲止所寫的大部分答案似乎都被解釋爲「創建一個新的答案」,但在描述中對索引重新編號的擔憂似乎意味着就地刪除。 – 2012-07-12 14:47:13
可以使用[radix sort](http://en.wikipedia.org/wiki/Radix_sort) – 2012-07-13 09:10:59
@JamesIry在O(n)中對'indicesToDelete'進行排序是的,你是對的,這一點不明確。是的,我想將刪除作爲就地刪除,而不是創建新的ListBuffer。 – 2012-07-15 17:41:26