2017-11-15 1 views
0

에 값을 반환 I I 각 목록을 통해 반복하고 모든 가능성을 가진 하나의 문자열을 생성 할 필요가 열거의 같은 키 값 쌍으로 반복 여러 열거하고 비약

list_of_vehicles = [{"Toyota" => "Corolla"},{"Honda"=> "Insight"}] 
list_of_colors = [{"C01"=> "Green"},{"C02"=> "White"}] 
list_of_capacity = [{"S01"=> "4"},{"S02"=> "2"}] 

다음과 같은 설정이있다. 지금까지 내가 다음과 같은 짓을

는 :

defp process_output(list_of_vehicles,list_of_colors,list_of_capacity) 
    Enum.each(list_of_vehicles, fn{k,v}->  
      final_output = "#{k}" 
      if(Enum.any?(list_of_colors)) do 
      Enum.each(list_of_colors, fn{k,v}-> 
       final_output = final_output<>"#{k}" 
       if(Enum.any?(list_of_capacity)) do 
       Enum.each(list_of_capacity, fn{k,v}-> 
        final_output = final_output <>"#{k}" 
       end) 
       else 
       final_output 
       end 
      end) 
      else 
      if(Enum.any?(list_of_capacity))do 
       Enum.each(list_of_capacity, fn{k,v}-> 
       final_output = final_output<>"#{k}" 
       end) 
      else 
       final_output 
      end 
      end 
     end) 
end 

나는 다른 방법이 최종 출력을 반환해야합니다.

list_of_outputs = process_output(vehicle_list,color_list_capacity_list) 

그러나 원하는 O/P에게 최종 출력 목록

에게

["ToyotaC01S01","ToyotaC01S02","ToyotaC02S01","ToyotaC02S02", 
"HondaC01S01","HondaC01S02","HondaC02S01","HondaC02S02",...etc] 
+0

보여주십시오 당신이 답을하지 않은 경우 알려줘 우리에게 원하는 입력과 원하는 출력. 나는 모든 열쇠를 연결해야한다는 것을 제대로 이해 했는가? – mudasobwa

+0

예 @mudasobwa, 모든 키를 연결하고 목록을 반환해야합니다. –

답변

4

범위 지정을 생성 할 수있는 방법을 찾을 수 없습니다. 범위 지정은 엘릭서에서 매우 중요합니다. do 블록 안에 변수를 바인딩 할 수 없으며 외부에서 볼 수있을 것으로 예상됩니다. each의 범위가 종료됨에 따라 리바운드 final_output이 (가) 삭제됩니다.

중복성. Enum.each([])가 조작 불능이기 때문에

if Enum.any?(list), do: Enum.each(...) 

if 여기에 중복입니다.

엘릭서 경고. 컴파일 과정에서 Elixir가 말한 것을 읽고 조언을 따르십시오. 변수가 사용되지 않으면 밑줄을 그 앞에 추가하십시오.

제어 흐름. 함수형 프로그래밍에서는 주로 플레인 루프가 아닌 map - reduce을 사용합니다. 알다시피 엘릭서에서는 for이나 while 루프를 사용할 수 없습니다. 이는 의도적으로 이루어 지므로 Enum.each으로 행동을 시뮬레이트하려고해서는 안됩니다. 그것은 작동하지 않습니다.

합산 최대 :

list_of_vehicles = [{"Toyota", "Corolla"}, {"Honda", "Insight"}] 
list_of_colors = [{"C01", "Green"}, {"C02", "White"}] 
list_of_capacities = [{"S01", "4"}, {"S02", "2"}] 

for {vehicle, _} <- list_of_vehicles, 
    {color, _} <- list_of_colors, 
    {capacity, _} <- list_of_capacities, 
do: vehicle <> color <> capacity 

#⇒ ["ToyotaC01S01", "ToyotaC01S02", "ToyotaC02S01", "ToyotaC02S02", 
# "HondaC01S01", "HondaC01S02", "HondaC02S01", "HondaC02S02"] 

는 여기에서 우리는 Kernel.SpecialForms.for/1 이해를 사용합니다.

입력을 Elixir 유효 튜플로 수정했습니다.

+0

목록의 항목 수가 같지 않으면 출력이 모든 조합을 반환하지 않습니다. 거기에 어떤 해결책이 있습니까? –

+1

물론 그렇습니다. 이해력은 입력의 길이에도 불구하고 모든 조합을 반환합니다. – mudasobwa

0

원하는 변수의 모든 키의 가능성을 얻으려면 3 중첩 루프를 사용하여 모든 가능성을 얻을 수 있습니다.예를

Enum.map(list_of_vehicles, 
    fn v -> (
    Enum.map(list_of_colors, 
    fn c -> (
     Enum.map(list_of_capacities, 
     fn cap ->(
     List.first(Map.keys v)<> List.first(Map.keys c) <> List.first(Map.keys cap)) 
     end) 
    ) 
    end) 
    ) 
    end 
) 
|> List.flatten 

에 대한

모든 목록을 평평하게 할 수 있고 당신이 원하는 출력을 얻을 것이다 반복 한 후

#["ToyotaC01S01", "ToyotaC01S02", "ToyotaC02S01", "ToyotaC02S02", "HondaC01S01", 
"HondaC01S02", "HondaC02S01", "HondaC02S02"]