2012-12-13 1 views
2

자바에서 다음과 같은 코드를 올바른 기능 방식으로 수행하는 가장 좋은 방법은 무엇입니까? 이상 물론,이 필수적 방법으로 스칼라에 직접 번역 될 수스칼라 모범 사례 : 2D 데이터 매핑

LinkedList<Item> itemsInRange = new LinkedList<Item>(); 
for (int y = 0; y < height(); y++) { 
    for (int x = 0; x < width(); x++) { 
     Item it = myMap.getItemAt(cy + y, cx + x); 
     if (it != null) 
      itemsInRange.add(it); 
    } 
} 

// iterate over itemsInRange later 

:

val itemsInRange = new ListBuffer[Item] 
for (y <- 0 until height) { 
    for (x <- 0 until width) { 
     val it = tileMap.getItemAt(cy + x, cx + x) 
     if (!it.isEmpty) 
      itemsInRange.append(it.get) 
    } 
} 

하지만 적절한 기능적인 방법으로 그것을하고 싶습니다.

일종의 2D 범위보다 map 조작이 있어야한다고 가정합니다. 이상적으로 mapxy을 입력 매개 변수로 사용하고 Option[Item]을 출력하는 함수를 실행합니다. 그 후 Iterable[Option[Item]]flatten과 같은 것을 얻게되면 Iterable[Item]이됩니다. 내가 옳다면, 퍼즐의 유일한 누락 된 부분은 어떤면에서 2D 범위에서지도 작업을하는 것입니다.

당신은 모두 하나의 좋은 단계에서이 작업을 수행 할 수 있습니다

답변

7

:

val tileMap = Map(
    (0, 0) -> 'a, 
    (1, 0) -> 'b, 
    (3, 2) -> 'c 
) 

우리는 단지 쓰기 :

def items[A](w: Int, h: Int)(at: ((Int, Int)) => Option[A]): IndexedSeq[A] = 
    for { 
    x <- 0 until w 
    y <- 0 until h 
    i <- at(x, y) 
    } yield i 

지금 우리는 4 × 4 보드의 심볼이 표현이 예를 들어 말 :

scala> items(4, 4)(tileMap.get) 
res0: IndexedSeq[Symbol] = Vector('a, 'b, 'c) 

나는 당신이 원하는 것이라고 생각합니다.

+0

고마워요! 정확히 내가 뭘 찾고있는 것 같아! 이 '수익률'물건 compherensions는 매우 유망 해 보인다! – GreyCat