【问题标题】:Scala - Safely get element from multidimensional arrayScala - 从多维数组中安全地获取元素
【发布时间】:2015-08-02 07:54:23
【问题描述】:
val arr = Array.fill[String](6, 6)("dark")

不安全的获取:

 arr(9)(9)
>java.lang.ArrayIndexOutOfBoundsException: 9

我使用类似的东西(但丑陋):

arr.lift(2).flatMap(_.lift(2))

>res0: Option[String] = Some(dark)

有没有更好的办法?

【问题讨论】:

  • 定义一个safeGet[T](x:Int, y:Int):Option[T],使用任何你喜欢的代码(一个明确的数组边界检查可能是最清楚的),然后使它成为一个对数组的隐式操作。那么丑就在一个地方……

标签: scala multidimensional-array collections


【解决方案1】:

如果你想要更易读的东西,你可以使用 for comprehension:

for {
 inner <- arr.lift(7)
 value <- inner.lift(2)
} yield value

【讨论】:

    【解决方案2】:

    把我的评论变成答案:

    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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2017-10-11
    • 2012-04-27
    相关资源
    最近更新 更多