Arrays Scala代码修饰-使用if语句循环2D数组

Arrays Scala代码修饰-使用if语句循环2D数组,arrays,scala,functional-programming,Arrays,Scala,Functional Programming,嘿,我对函数式编程相当陌生,那么编写这种代码的最类似scala的方式是什么呢 var ANSWERS_ARRAY // Is array for ((rows, i) <- SOME_2D_ARRAY.view.zipWithIndex) for ((col, j) <- rows.view.zipWithIndex) if (col == SOME_VALUE) // add tuple of (SOME_VALUE, (i,j))

嘿,我对函数式编程相当陌生,那么编写这种代码的最类似scala的方式是什么呢

var ANSWERS_ARRAY // Is array
for ((rows, i) <- SOME_2D_ARRAY.view.zipWithIndex)
      for ((col, j) <- rows.view.zipWithIndex)
        if (col == SOME_VALUE)
          // add tuple of (SOME_VALUE, (i,j)) to an ANSWERS_ARRAY
var-ANSWERS\u-ARRAY//Is-ARRAY

对于((行,i)一个简单的解决方案,使用
zipWithIndex
和a进行理解:

val SOME_2D_数组:List[List[Int]=???
val某些值:Int=???
val-ANSWERS\u数组:列表[(Int,(Int,Int))]=for{

(行,i)一个简单的解决方案,使用
zipWithIndex
和a进行理解:

val SOME_2D_数组:List[List[Int]=???
val某些值:Int=???
val-ANSWERS\u数组:列表[(Int,(Int,Int))]=for{

(rows,i)代码的逻辑一开始就不是很实用

在函数式编程中,您通常处理不可变数据,在这些数据上应用函数以获得新的不可变值

这样做的惯用方法如下:

val answerArray = my2DArray.zipWithIndex.flatMap {
  case (row, i) => row.zipWithIndex.filter{
    case (col, j) => col == someValue
  }.map {
    case (col, j) => (someValue, (i, j))
  }
}
这是一段可读性不强的代码,特别是对于初学者来说,因此让我们对其进行分解:

  • 首先,我们使用
    flatMap
    遍历我们的2D数组(带索引),它需要一个函数作用于每个元素。该函数必须为每个元素返回另一个数组,并将所有这些数组展平为一个数组(因此在
    flatMap
    中为“flat”)

  • 数组的元素是初始数组的一个元素对,即一行及其索引,因此我们在这对元素上进行模式匹配,以便能够正确定义我们的函数

  • 现在,对于每一行,我们想做什么呢?只保留满足条件的元素,因此我们对其进行
    筛选
    ,并使用谓词(这只是返回
    布尔值的函数的花哨名称),返回仅包含满足条件的值的数组

  • 但是,我们不需要这些值,而是需要它们的转换,因此我们将
    map
    应用于数组。
    map
    flatMap
    相同,只是它的参数不需要返回数组,因为返回值不会被展平(它只是通过给定函数生成第一个数组元素的图像数组)

  • 我们想在剩下的元素上应用什么函数呢?我们只需要三元组
    (someValue,(i,j))

  • 注意,我使用了camelCase,这也是在scala中命名变量的惯用方法(尽管这不是必需的)

好的,我们有一些很好的代码可以做我们想要的,但是它不是很可读。谢天谢地,作为一种很好的语法糖,这种语言需要理解来替换
flatMap
s、
map
s和
filter
s,使之成为一种更具命令性的样式。请注意,这只是为了便于编写代码,而且在编译时,code将被我上面描述的内容(或类似的内容)所取代

val answerArray=for{

(row,i)代码的逻辑从一开始就不是很实用

在函数式编程中,您通常处理不可变数据,在这些数据上应用函数以获得新的不可变值

这样做的惯用方法如下:

val answerArray = my2DArray.zipWithIndex.flatMap {
  case (row, i) => row.zipWithIndex.filter{
    case (col, j) => col == someValue
  }.map {
    case (col, j) => (someValue, (i, j))
  }
}
这是一段可读性不强的代码,特别是对于初学者来说,因此让我们对其进行分解:

  • 首先,我们使用
    flatMap
    遍历我们的2D数组(带索引),它需要一个函数作用于每个元素。该函数必须为每个元素返回另一个数组,并将所有这些数组展平为一个数组(因此在
    flatMap
    中为“flat”)

  • 数组的元素是初始数组的一个元素对,即一行及其索引,因此我们在这对元素上进行模式匹配,以便能够正确定义我们的函数

  • 现在,对于每一行,我们想做什么呢?只保留满足条件的元素,因此我们对其进行
    筛选
    ,并使用谓词(这只是返回
    布尔值的函数的花哨名称),返回仅包含满足条件的值的数组

  • 但是,我们不需要这些值,而是需要它们的转换,因此我们将
    map
    应用于数组。
    map
    flatMap
    相同,只是它的参数不需要返回数组,因为返回值不会被展平(它只是通过给定函数生成第一个数组元素的图像数组)

  • 我们想在剩下的元素上应用什么函数呢?我们只需要三元组
    (someValue,(i,j))

  • 注意,我使用了camelCase,这也是在scala中命名变量的惯用方法(尽管这不是必需的)

好的,我们有一些很好的代码可以做我们想要的,但是它不是很可读。谢天谢地,作为一种很好的语法糖,这种语言需要理解来替换
flatMap
s、
map
s和
filter
s,使之成为一种更具命令性的样式。请注意,这只是为了便于编写代码,而且在编译时,code将被我上面描述的内容(或类似的内容)所取代

val answerArray=for{

(第一排)先生。谢谢你这么简短的回答。对此我很抱歉。我宁愿有一个很长的解释,也不愿把你留在函数式编程的丛林中而不理解你在做什么。先生。谢谢你这么简短的回答。对此我很抱歉。我宁愿有一个很长的解释,也不愿把你留在函数式编程的丛林中而不知道你在做什么不管你在做什么。