邻居

2017-07-18 140 views
0

假设我需要枚举给定小区的所有邻居Vector[Vector[Int]]邻居

type Matrix = Vector[Vector[Int]] 
def neighbors(i: Int, j: Int, m: Matrix): Seq[Int] = ??? 

我写neighbors这样的:

def neighbors(i: Int, j: Int, m: Matrix): Seq[Int] = for { 
    dx <- -1 to 1 
    dy <- -1 to 1 
    if (dx | dy) != 0 && m.indices.contains(i + dx) && m(i).indices.contains(j + dy) 
} yield m(i + dx)(j + dy) 

此实现看起来不错,但有点尴尬。你能提出一个更好的解决方案吗

+1

可以简化'.indices.contains(...)'来的更直接的'.isDefinedAt(...)'。 – jwvh

+0

好点。谢谢 ! – Michael

回答

1

并不简单 - 使用电梯

def neighbors(i: Int, j: Int, m: Matrix): Seq[Int] = (-1 to 1).flatMap { 
    y => (-1 to 1).map { x => (x, y) } 
    }.withFilter { 
    case (x, y) => x != 0 || y != 0 
    }.flatMap { 
    case (x, y) => m.lift(i).flatMap(x => x.lift(y)) 
    }