2016-07-24 149 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 
相關問題