Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scala - Safely get element from multidimensional array

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?

like image 700
EnverOsmanov Avatar asked May 26 '26 14:05

EnverOsmanov


2 Answers

If you want something more readable, you could use a for comprehension:

for {
 inner <- arr.lift(7)
 value <- inner.lift(2)
} yield value
like image 97
Sascha Kolberg Avatar answered May 30 '26 05:05

Sascha Kolberg


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
like image 29
The Archetypal Paul Avatar answered May 30 '26 05:05

The Archetypal Paul



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!