不像其他人,我会假设你想,因为你提一个关于指数重新编号关注做你的就地工作。如果排序是所有你关心的则
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