2017-07-13 7 views
0

構造体フィールドからすべてのX値とY値を収集し、同じX値に属するY値をマップに配置しようとしていますが、3レベル下に入れ子になっています。マップ最適化を含む入れ子範囲ループ

以下
topClasses := make([]TopClass, 0) 
// populate topClasses Slice here 

KeyValueMap := make(map[int][]int) 

for _, nestedClass := range topClasses { 
    for _, nestedItem := range nestedClass.nestedList { 
     for _, value := range nestedItem.Values { 
      if _, found := KeyValueMap[value.X]; !found { 
       KeyValueMap[value.X] = []int{value.Y} 
      } else { 
       KeyValueMap[value.X] = append(KeyValueMap[value.X], value.Y) 
      } 
     } 
    } 
} 

は、構造体が実装されている方法です:

現在、私は次のコードを使用しています

type TopClass struct { 
    nestedList []ListClass 
} 

type ListClass struct { 
    Values []Value  
} 

type Value struct { 
    X int 
    Y float64 
} 

はゴルーチン、チャネルを使用してこれを行うには、より効率的な方法はありますが、と私はマップを使って作業していますが、/またはwaitgroupsなど?

+0

同期オーバーヘッドなどの理由で、ゴルーチンがここで助けになることはまずありません。地図やスライスのサイズを先取りすることでパフォーマンスを向上させることができます。例えばKeyValueMap [value.X] = make([] int、0、1000) ' - ' 1000'は実際のサイズを反映しています測定。 –

+0

'topClass'、' nestedClass'、 'nestedItem'の定義方法に関する情報がないと、あなたの現在の実装よりも*効率的な方法*を見つけるのは難しいです。 – putu

+0

UPDATE:構造体の定義が追加されました。 –

答えて

1

次のコードでは、キーがすでに存在する場合に追加のマップ参照が不要になります。それはまた短いです。

KeyValueMap := make(map[int][]int) 

for _, nestedClass := range topClass { 
    for _, nestedItem := range nestedClass.nestedList { 
     for _, value := range nestedItem.Values { 
      KeyValueMap[value.X] = append(KeyValueMap[value.X], value.Y) 
     } 
    } 
} 
関連する問題