과 같이 쓸 수있다, 나는 당신이 인덱스 번호를 다시 매기에 대한 우려를 언급하기 때문에 현재 위치에서 작업을하고 싶은 생각이 드는거야. 정렬이 신경 써야한다면
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를 변경하려는 것은 사용자의 설명에서 완전히 명확하지 않습니다. 이것은 작성해야 할 코드 스타일에 큰 영향을 미칩니다. 지금까지 작성된 답변의 대부분은 "새로운 항목 만들기"로 해석되었지만 설명에서 색인 번호를 다시 매기는 것에 대한 우려는 적절한 삭제를 의미하는 것으로 보입니다. –
[radix sort]를 사용하여 O (n)에서'indicesToDelete'를 정렬 할 수 있습니다. (http://en.wikipedia.org/wiki/Radix_sort) –
@JamesIry 예, 맞습니다.이 시점은 분명하지 않았습니다. 예, 새 ListBuffer를 만들지 않고 전체 삭제 (in-place deletion)로 제거하려고했습니다. –