2016-07-24 10 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 может иметь более элементов, чем в контекстеListBufferForSubGroup. Мы должны игнорировать последние дополнительные элементы в 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