2013-10-16 4 views
1

와 튜플 찾기 : 튜플을 반환 할 수 있다는두 개의 키 예를 들어

Db = [{pid1, {key1, {apple}}}, {pid1, {key2, {banana}}}, {pid1, {key3, {watermelon}}}, {pid2, {key1, {cucumber}}}, {pid2, {key2, {carrot}}}]. 

곳이 될 것입니다도 (Pid) = PID1 및 키 = 키 1, {PID 1, {키 1, {사과}}}. 이 일을 어떻게 하죠? BIF 목록과 비슷한 항목 : keyfind/3.

답변

0

, 당신은 패턴 매칭을 사용하여 직접 구현할 수 있습니다

pidkeyfind(_Pid, _Key, []) -> false; 
pidkeyfind(Pid, Key, [Head = {Pid, {Key, _}} | _Tail]) -> Head; 
pidkeyfind(Pid, Key, [_|Tail]) -> pidkeyfind(Pid, Key, Tail). 
+0

하지만 대부분 1 개 기록에 있다는 것을 전제로 그 요청이 일치하는 경우 평균 속도가 빨라야합니다. – Pascal

+0

실제로 파스칼. 필자는이 해석 (단일 히트)을 선택했습니다. 그 이유는 목록 : keyfind/3가 작동하기 때문입니다. –

1

목록 : filter/2 작동해야하며, 여기에 사용 방법의 예가 나와 있습니다. 당신이 가치를 발견 할 때 조기 중단 할 경우

1> Db = [{pid1, {key1, {apple}}}, {pid1, {key2, {banana}}}, {pid1, {key3, {watermelon}}}, {pid2, {key1, {cucumber}}}, {pid2, {key2, {carrot}}}]. 
[{pid1,{key1,{apple}}}, 
{pid1,{key2,{banana}}}, 
{pid1,{key3,{watermelon}}}, 
{pid2,{key1,{cucumber}}}, 
{pid2,{key2,{carrot}}}] 
2> Find = fun (K1,K2,L) -> lists:filter(fun({X,{Y,_}}) -> X =:= K1 andalso Y =:= K2 end,L) end. 
#Fun<erl_eval.18.82930912> 
3> Find(pid1,key1,Db). 
[{pid1,{key1,{apple}}}] 
1

는 조회를 수행하는 여러 가지 방법, 그리고 더 좋은 방법이 있습니다. 대부분 이며 스타일은입니다.

  • 당신은 재귀 함수 @Emil Vikström에 의해 suggested로, 즉시 결과가 일치로 돌아갑니다를 작성할 수 있습니다. 장점은 모든 요소를 ​​살펴 보지 않고 결과가 발견되는 즉시 조회가 반환된다는 것인데, 이는 lists:keyfind/3과 유사합니다. 그러나 목록이 그러한 최적화를 정당화하기에 충분히 길다면 정렬 된 목록이나 트리와 같은 다른 데이터 구조가 더 적절할 수 있다고 주장 할 수 있습니다.

  • lists:filter/2suggested by @Pascal으로 사용할 수 있습니다. 이것은 코드 유지 보수에 항상 좋은 라이브러리 함수를 기반으로하는 재귀 함수보다 장점이 있습니다.

  • 목록 이해율 내에 필터를 사용할 수 있습니다. 이는 lists:filter/2 접근 방식과 비슷하지만 조금 짧습니다. 많은 사람들은 특히 테스트가 너무 짧을 때 lists:map/2lists:filter/2을 사용하는 것보다 Erlang과 같은 목록 이해력을 보게됩니다.

    [T || {Pid, {Key, _Value}} = T <- Db, Pid =:= MyPid, Key =:= MyKey].

    키 1과 PID1있는 상수 경우, 당신도 쓸 수 있습니다 :이 작품 더 많은 교훈입니다

    [T || {pid1, {key1, _Value}} = T <- Db].