如何从任何复杂的术语中提取支持者列表{K,V}

时间:2013-05-25 11:26:03

标签: erlang

有一个可能由任何组成的术语,例如orddicts,orddicts列表,orddicts orddicts orddicts,列表,orddicts的支持者或......如:

Term1 = [ 
      {"AAA", [ 
               { "K1", "ka1" },
               { "K2", "ka2" }, 
               { "K3", "ka3" } 
              ]
      },
      {"BBB","one"},
      {"CCC", [ 
               { "K1", "kb1" },
               { "K2", "" }, 
               { "K3", "kb3" } 
              ]
      },
      {"DDD", [ 
                [
                 { "K1", "kc1" },
                 { "K2", "kc2" }
                ],
                [
                 { "K1", "kd1" },
                 { "K2", "kd2" }
                ],
                "CACETA",
                123
              ]
      },
      {"EEE", [ 
               { "K1", "kb1" },
               { "K2", 1122  }, 
               { "K3", "kb3" } 
              ]
      },
              { "T1", "T2", "T3" },
              123,
              { "X" },
              [ 1, 2, 3, { "K5", "V5" } ] 
],

我需要制作所有支持者列表[{K,V},...] ,例如

[
   { "AAA" , [ ...... ] },
   { "K1"  , "ka1" },
   { "K2" , "ka2" }, 
   ...
   { "BBB" ,"one"},
   { "CCC" , [ ... ] },
   { "K1"  , "kb1" },
   ...
   { "K5", "V5" } 
]
  • 请注意,必须在列表中重复键,其值可以是字符串,列表,tupple或数字,等等。

  • 上例中数据中的最后一项,例如{“T1”,“T2”,“T3”}不应该在结果中,因为它不是两个术语的列表{K, V},但嵌套的 {“K5”,“V5”} 是并且应该是结果的一部分。

我看着这个类似的solution并尝试稍微调整一下,但是我的新手erlang大脑很难让它与上面的场景一起工作。

以下是我尝试使用它的示例,但有一些错误,模式匹配相关:

extractPropList( [], ResultList ) -> ResultList;

extractPropList( [H|T], ResultList ) -> extractPropList(T, extractPropList(H, ResultList));

extractPropList( {K,V}, ResultList ) -> [ {K,V} | extractPropList(K, extractPropList(V, ResultList)) ].

1 个答案:

答案 0 :(得分:1)

在测试上述方法时,缺少的部分是处理没有其他匹配项的最后一行(不是列表,而不是{K,V}):

extractPropLists( [], ResultList ) -> ResultList;
extractPropLists( [H|T], ResultList ) ->    extractPropLists(T, extractPropLists(H, ResultList));
extractPropLists( {K,V}, ResultList ) -> [ {K,V} | extractPropLists(K, extractPropLists(V, ResultList)) ];
extractPropLists( T, ResultList ) -> ResultList.

鉴于数据与avove相似,我获得的结果

[{"EEE",[{"K1","kb1"},{"K2",1122},{"K3","kb3"}]},
 {"K3","kb3"},
 {"K2",1122},
 {"K1","kb1"},
 {"DDD",
  [[{"K1","kc1"},{"K2","kc2"}],
   [{"K1","kd1"},{"K2","kd2"}],
   "CACETA",123]},
 {"K2","kd2"},
 {"K1","kd1"},
 {"K2","kc2"},
 {"K1","kc1"},
 {"CCC",[{"K1","kb1"},{"K2","kb2"},{"K3","kb3"}]},
 {"K3","kb3"},
 {"K2","kb2"},
 {"K1","kb1"},
 {"BBB","one"},
 {"AAA",[{"K1","ka1"},{"K2","ka2"},{"K3","ka3"}]},
 {"K3","ka3"},
 {"K2","ka2"},
 {"K1","ka1"}]