2017-10-18 20 views
2

Enum関数を使ってエリクシルで2つの配列をどのようにマージしますか?エリクサー - マージ2一覧のリスト(列のような)

など。

points = [[1.0, 2.0], 
       [5.0, 3.0], 
       [2.0, 4.0], 
       [3.0, 1.0], 
       [2.0, 2.0], 
       [4.0, 3.0], 
       [1.0, 2.0], 
       [2.0, 5.0], 
       [14.0, 13.0], 
       [11.0, 12.0], 
       [12.0, 15.0], 
       [32.0, 25.0]] 

    results = [1.0, 
       3.0, 
       2.0, 
       1.0, 
       3.0, 
       2.0, 
       1.0, 
       3.0, 
       2.0, 
       1.0, 
       3.0, 
       2.0] 

組み合わせアレイ(列を追加)、次のようになります。

combined = [[1.0, 2.0, 1.0], 
       [5.0, 3.0, 3.0], 
       [2.0, 4.0, 2.0], 
       [3.0, 1.0, 1.0], 
       [2.0, 2.0, 3.0], 
       [4.0, 3.0, 2.0], 
       [1.0, 2.0, 1.0], 
       [2.0, 5.0, 3.0], 
       [14.0, 13.0, 2.0], 
       [11.0, 12.0, 1.0], 
       [12.0, 15.0, 3.0], 
       [32.0, 25.0, 2.0]]  

このような何かが動作するはずのように思え:

points 
    |> Stream.with_index 
    |> Enum.map(fn({x,i}) -> Enum.into(x, Enum.fetch!(results, i)) end)     

が、これはエラーを生成します。

** (Protocol.UndefinedError) protocol Collectable not implemented for 1.0. This protocol is implemented for: BitString, Ecto.Adapters.SQL.Stream, File.Stream, HashDict, HashSet, IO.Stream, List, Map, MapSet, Plug.Conn, Postgrex.Stream 
    (elixir) lib/collectable.ex:1: Collectable.impl_for!/1 
    (elixir) lib/collectable.ex:77: Collectable.into/1 
    (elixir) lib/enum.ex:1158: Enum.into_protocol/2 
    (elixir) lib/enum.ex:1259: anonymous fn/3 in Enum.map/2 
    (elixir) lib/enum.ex:1824: anonymous fn/3 in Enum.map/2 
    (elixir) lib/stream.ex:1413: anonymous fn/3 in Enumerable.Stream.reduce/3 
    (elixir) lib/stream.ex:978: anonymous fn/3 in Stream.with_index/2 
    (elixir) lib/enum.ex:3161: Enumerable.List.reduce/3 
    (elixir) lib/stream.ex:1433: Enumerable.Stream.do_each/4 
    (elixir) lib/enum.ex:1823: Enum.map/2 

答えて

5

、あなたはEnum.zip/2を使用して考えなければなりません。これは私がEnum.zip/2forでそれを行うだろうかです:

for {point, result} <- Enum.zip(points, results) do 
    point ++ [result] 
end 
|> IO.inspect 

出力:

[[1.0, 2.0, 1.0], [5.0, 3.0, 3.0], [2.0, 4.0, 2.0], [3.0, 1.0, 1.0], 
[2.0, 2.0, 3.0], [4.0, 3.0, 2.0], [1.0, 2.0, 1.0], [2.0, 5.0, 3.0], 
[14.0, 13.0, 2.0], [11.0, 12.0, 1.0], [12.0, 15.0, 3.0], [32.0, 25.0, 2.0]] 

再:あなたのコードが動作しない理由:Enum.intoの2番目の引数は可算である必要があります。おそらく、リストでそれをラップしたい:

Enum.into(x, [Enum.fetch!(results, i)]) 

私もEnum.zip/2ソリューションを使用してお勧めしたいです。

+0

それは素晴らしいです、私は本当に答えが好きです –

0

zip列挙型から、のような:あなたは、同時に2つのenumerablesを反復処理したいとき

resultado=for {point, res} <- Enum.zip(points, results) do 
    point ++ [res] 
    end 
関連する問題