2016-07-24 7 views
0

私はスカラーを初めて使い、以下のコードをリファクタリングしようとしています。以下のコードで使用されている "インデックス"を削除し、データをフェッチします。例えばスカラーで配列をループする最良の方法

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 
    } 
} 

変数の値は以下のようにしている場合、:

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

注:

instanceIndividualは多くを持つことができます

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

次にコンテキストのようなものでなければなりませんcontextListBufferForSubGroupの要素よりも優先されます。この場合、instanceIndividualの最後の余分な要素を無視する必要があります

答えて

1

タプルのリストに2つのリストを圧縮してマップすることができます。例:

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 
関連する問題