2014-01-11 3 views
4

에 문자열 배열에서 n 번째 요소를 제거해도 배열 [문자열] 내가 가진 가정 스칼라

방법 스칼라에서 단순히 n 번째 요소를 제거 할 수 있습니다 (제가 생각하는 것은 기본적으로 변경할 수 있습니다)?

간단한 방법이 없습니다.

def dropEle(n: Int): Array[T] 
Selects all elements except the nth one. 

n 
the subscript of the element to drop from this Array. 
Returns an Array consisting of all elements of this Array except the 
nth element, or else the complete Array, if this Array has less than 
n elements. 

많은 감사 :

같은 뭔가 (내가 이것을 만든)을 원하십니까.

+0

이해 하시겠습니까? 그의 N 시간 복사 (또는 요소 이동) 필요하며 O (1)에서 수행되지 않을 것인가? –

+0

비용은 문제가 아니며, 오히려 또 다른보다 효율적인 데이터 구조를 사용하고 싶습니다. 그러나 많은 상호 의존성 때문에이 문제를 고수해야합니다. 그리고 나는 억압하는 것을 싫어합니다 - spasiba bolshoi! –

+0

배열이어야합니까? List로 변환하고 필요한 모든 작업을 수행 한 다음 Array로 다시 변환 할 수 있습니까? –

답변

2

DEF dropEle [T (N : INT, 물 : 배열 [T]) 배열 [T] = 조심히 (N - 1) ++ in.drop (n)은

8

는 그것이 무엇입니까 보기입니다.

scala> implicit class Foo[T](as: Array[T]) { 
    | def dropping(i: Int) = as.view.take(i) ++ as.view.drop(i+1) 
    | } 
defined class Foo 

scala> (1 to 10 toArray) dropping 3 
warning: there were 1 feature warning(s); re-run with -feature for details 
res9: scala.collection.SeqView[Int,Array[Int]] = SeqViewSA(...) 

scala> .toList 
res10: List[Int] = List(1, 2, 3, 5, 6, 7, 8, 9, 10) 
+0

왜'view'를 선택했는지 설명해 주시겠습니까? –

+0

@KevinMeredith 중간 복사본을 피하려고합니다. 뷰가 강제 될 때까지 인덱스 연산을 처리하고있는 것 같습니다. 아마도. 물론 조회수는 증오 성 메일을 많이받습니다. –

+0

'toIterator'는 증오 메일을 원하지 않는 경우를 대비하여'view'를 대체합니다 : – sourcedelica

5

배열의 요소가 변경 될 수 있지만 크기를 변경할 수 없으므로 선택한 semi-mutable 컬렉션에 문제가 있습니다. 이미 "remove (index)"메소드를 제공하는 Buffer가 필요합니다.

당신은이 작업 배열의 첫 번째 요소를 참조 nth=0를 들어

def remove(a: Array[String], i: index): Array[String] = { 
    val b = a.toBuffer 
    b.remove(i) 
    b.toArray 
} 
0

을 수행하기 위해와 버퍼에서 변환 쉽게, 당신은 이미 배열을 가질 수 있습니다 가정

def dropEle[T](nth: Int, in: Array[T]): Array[T] = { 
    in.view.zipWithIndex.filter{ e => e._2 != nth }.map{ kv => kv._1 }.toArray 
} 

다소 간단한 구문 포함

def dropEle[T](nth: Int, in: Array[T]): Array[T] = { 
    in.view.zipWithIndex.filter{ _._2 != nth }.map{ _._1 }.toArray 
}