2013-04-10 3 views
1

배열 배열을 변환하고 싶습니다. 다음과 같이 수행 할 수 있습니다.스칼라에서 변환 된 배열의 인덱스를 얻는 방법

var cal = Array.ofDim[Double](300, 10000); 
cal.foreach(x => x.transform(y => some_value)) 

변환 된 셀의 색인에 액세스하는 방법은 무엇입니까? 예를 들어 :

cal.foreach(x => x.zipWithIndex.transform(y => (x(y._2) + 7, y._2))); 

을 그러나 이것은 "CAL"값을 변경하지 않은 :

cal.foreach(x => x.transform(y => x(y.index - 1) + 7)) 

나는 zipWithIndex을 사용했습니다.

감사합니다.

답변

4

x.zipWithIndex을 호출하면 에 새 튜플 모음이 반환되므로 해당 옵션이 작동하지 않습니다. 이것은 기본 배열에 영향을 미치지 않습니다.

인덱스에 액세스 할 수있는 상태에서 배열을 수정하는 것을 허용 할 수는 없습니다. 그러나 경우 새 컬렉션을 반환하는 더 많은 기능 스타일을 채택 할 수있다, 당신은 다음과 같이 뭔가를 할 수 : cal 이후

사실
val cal = Array.ofDim[Double](300, 10000) map { x => 
    x.zipWithIndex map (y => x(y._2) + 7) 
}; 

이 예에서 변경 가능한, 당신은 재 할당을 통해 같은 일을 할 수 있습니다. 변수를 피할 수 있다면 변경 가능한 변수를 장려하는 것이 아닙니다.

2

은이 같은 자바 틱 방법으로 그것을 할 수있는 장소에 업데이트를 수행합니다

for(y <- 0 until cal.length; 
    row <- cal(y); 
    x <- 0 until row.length) 
{ 
    row(x) = some value // here you can get the indexes through (x, y) 
} 

// or 

for((row, y) <- cal.zipWithIndex; 
    x <- 0 until row.length) 
{ 
    row(x) = some value // here you can get the indexes through (x, y) 
} 
0

당신이 표준 라이브러리에서 함수를 찾을 수없는 경우 가장 쉬운 해결책은 자신을 작성하는 것입니다, 특히 그것이 단순한 것이라면. 스칼라 함수의 인자로서 함수에 관해서는 마법 같은 것이 없다.

암시 적 클래스는 일반 호출 규칙을 에뮬레이트 할 수 있습니다. 예를 들어 :

import scala.collection.mutable._ 

object Extensions { 
    implicit class ExtMutSeq[T](val seq: Seq[T]) extends AnyVal { 
    def transform_indexed(f: (T, Int) => T) { 
     for (i <- 0 until seq.length) { 
     seq(i) = f(seq(i), i) 
     } 
    } 
    } 
} 

object Program extends App { 
    import Extensions._ 
    val a = ArraySeq(1,2,3,4) 
    a.transform_indexed((item, pos) => if (pos % 2 == 0) 0 else item) 
    println(a) 
} 

이 (당신의 행의 실제 유형이 무엇인지에 따라, 당신은 위의 seq의 유형을 조정해야 할 수도 있습니다.)

당신은 추상화와 재사용의 이중 혜택을받을. 추상화는 한 번만 작성해야하기 때문에 한 곳에서 인덱스를 사용하여 변환 개념을 캡슐화 할 수 있으므로 재사용 할 수 있습니다. 그리고 짧은 코드이기 때문에 표준 라이브러리에 의존 할 필요가 없습니다.

관련 문제