Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:安全访问列表[DataFrame]中的索引_Scala_List_Dataframe_Indexing - Fatal编程技术网

Scala:安全访问列表[DataFrame]中的索引

Scala:安全访问列表[DataFrame]中的索引,scala,list,dataframe,indexing,Scala,List,Dataframe,Indexing,我收到一个列表[DataFrame],我想将每个df存储在一个变量中。列表中始终存在某些值: val routes = dataframes(0) val stops = dataframes(1) 但是其他的也可能会出现,所以大小列表是可变的。 如何安全地访问可能超出范围的列表索引?我认为使用Some()并处理结果可以: val fare_attributes : Option[DataFrame] = Some(dataframes(10)) fare_attributes match

我收到一个
列表[DataFrame]
,我想将每个df存储在一个变量中。列表中始终存在某些值:

val routes = dataframes(0)
val stops = dataframes(1)
但是其他的也可能会出现,所以大小列表是可变的。 如何安全地访问可能超出范围的列表索引?我认为使用
Some()
并处理结果可以:

val fare_attributes : Option[DataFrame] = Some(dataframes(10))

fare_attributes match {
      case Some(fare) =>  upload())
        println("fare_attributes uploaded")

      case None => println("No fare_attributes found")
    }

但我收到:
java.lang.IndexOutOfBoundsException:2
您可以在列表中使用
.lift

val fare_attributes : Option[DataFrame] = dataframes.lift(10)

我认为在访问索引值之前,您必须检查列表的长度。您可能需要实现一些包装器函数来实现这一点。这样就不会重复进行

您可以通过使用两个参数列表来对其进行咖喱处理,这有点“优雅”。因此,您的代码有点简洁。这是一个你可以改进的样品

def safeList(list: List[Int])(index: Int): Int = {
  if (index < list.length) list(index)
  else 0
}

val x = List(1, 2 ,3 )
val y = safeList(x)(_)

val a = y(0) // returns 1
val b = y(1) // returns 2
val c = y(4) // returns 0
def安全列表(列表:列表[Int])(索引:Int):Int={
如果(索引<列表长度)列表(索引)
其他0
}
val x=列表(1、2、3)
val y=安全列表(x)(ux)
val a=y(0)//返回1
val b=y(1)//返回2
val c=y(4)//返回0

作为对其工作原理的补充说明,
lift
PartialFunction[a,B]
上的一种方法,它返回一个
a=>选项[B]
List[a]
扩展自
PartialFunction[Int,a]
(因此它有
lift
方法)。所以您实际上是在调用
dataframes.lift.apply(10)