val arr = Array.fill[String](6, 6)("dark")
Unsafe get:
arr(9)(9)
>java.lang.ArrayIndexOutOfBoundsException: 9
I use something like that (but ugly):
arr.lift(2).flatMap(_.lift(2))
>res0: Option[String] = Some(dark)
Is there better way?
If you want something more readable, you could use a for comprehension:
for {
inner <- arr.lift(7)
value <- inner.lift(2)
} yield value
Turning my comment into an answer:
val arr = Array.fill[String](6, 6)("dark")
implicit class SafeArrayOps[T](arr: Array[Array[T]]) {
def safeGet(x: Int, y: Int) = {
if (x < 0 || x >= arr.length) None
else {
val inner = arr(x)
if (y <= 0 || y >= inner.length) None
else Some(inner(y))
}
}
}
arr.safeGet(2,2) //> res0: Option[String] = Some(dark)
arr.safeGet(7,7) //> res1: Option[String] = None
arr.safeGet(2,7) //> res2: Option[String] = None
arr.safeGet(7,2) //> res3: Option[String] = None
arr.safeGet(-1, 2) //> res4: Option[String] = None
arr.safeGet(2,-1) //> res5: Option[String] = None
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With