2016-07-24 60 views
0

我是新来的scala,我试图重构下面的代码。我想消除在下面的代码中使用的“索引”,并循环到数组中获取数据。什么是在scala中循环数组的最佳方式

subgroupMetricIndividual.instances.foreach { instanceIndividual => 
    val MetricContextListBuffer: ListBuffer[Context] = ListBuffer() 
    var index = 0 
    contextListBufferForSubGroup.foreach { contextIndividual => 
     MetricContextListBuffer += Context(
       entity = contextIndividual, 
       value = instanceIndividual(index).toString 
     ) 
     index += 1 
    } 
} 

例如,如果变量的值如下:

contextListBufferForSubGroup = ("context1","context2") 
subgroupMetricIndividual.instances = {{"Inst1","Inst2",1},{"Inst3","Inst4",2}} 

,则前后应该是这样的:

{ 
    entity: "context1", 
    value: "Inst1" 
    }, 
    { 
    entity: "context2", 
    value: "Inst2" 
    }, 
    { 
    entity: "context1", 
    value: "Inst3" 
    }, 
    { 
    entity: "context2", 
    value: "Inst4" 
    } 

注:

instanceIndividual可以有更多的元素比contextListBufferForSubGroup中的元素要多。在这种情况下,我们必须忽略instanceIndividual中的最后一个额外元素

回答

1

您可以将两个列表压缩到一个元组列表中,然后映射它。 例如

subgroupMetricIndividual.instances.foreach { instanceIndividual => 
    val MetricContextListBuffer = contextListBufferForSubGroup.zip(instanceIndividual).map { 
    case (contextIndividual, instanceIndividualIndex) => Context(
     entity = contextIndividual, 
     value = instanceIndividualIndex.toString 
    ) 
    } 
} 

如果Context可以这样调用一个函数,即Context(contextIndividual, instanceIndividualIndex.toString)那么你可以写这个更短。

subgroupMetricIndividual.instances.foreach { instanceIndividual => 
    val MetricContextListBuffer = contextListBufferForSubGroup 
    .zip(instanceIndividual.map(_.toString)).map(Context.tupled) 
} 
1

不知道你的确切数据类型,我嘲笑了一些东西,可能是接近你想要什么,并使用地图稍微更多的功能,和不可改变的集合

case class Context(entity:String, value:String) 

val contextListBufferForSubGroup = List("context1","context2") 
val subgroupMetricIndividualInstances = List(List("Inst1","Inst2",1),List("Inst3","Inst4",2)) 

val result: List[Context] = subgroupMetricIndividualInstances.map { instanceIndividual => 
contextListBufferForSubGroup.zip(instanceIndividual) map { case v: (String, String) => 
    Context(
     entity = v._1, 
     value = v._2 
    ) 
    } 
}.flatten 
相关问题