2011-03-07 6 views
2

[z,z,a,z,z,a,a,z][{z,2},{a,1},{z,2},{a,2},{z,1}]으로 변환하고 싶습니다. 내가 어떻게 해?튜플 목록으로 변환

그래서 이전 값, 카운터 및 튜플 목록을 누적해야합니다.

나는 기록

-record(acc, {previous, counter, tuples}). 

listToTuples([]) -> []; 
listToTuples([H | Tail]) -> 
    Acc = #acc{previous=H, counter=1}, 
    listToTuples([Tail], Acc). 

을 재정의를 만들했습니다 그러나 나는 몇 가지 문제

listToTuples([H | Tail], Acc) -> 
    case H == Acc#acc.previous of 
     true -> 
     false -> 
    end. 

답변

8

이 당신은 역으로 답 (ACC)를 구축 할 경우 이전은 그 목록의 머리가됩니다. 여기

내가 그것을 할 것입니다 방법 -

list_pairs(List) -> list_pairs(List, []). 

list_pairs([], Acc) -> lists:reverse(Acc); 
list_pairs([H|T], [{H, Count}|Acc]) -> list_pairs(T, [{H, Count+1}|Acc]); 
list_pairs([H|T], Acc) -> list_pairs(T, [{H, 1}|Acc]). 

(내가 사람이 이제 한 줄 지능형리스트 버전 따를 기대 ..)

+0

목록 작성으로이 작업을 수행 할 수 있을지 의심 스럽습니다. 최소한 폴드가 필요합니다. –

5

본인은 도로 건설에 계속 반대로 목록. 첫 번째 줄에서 X와 일치하는 패턴을 확인하십시오.

F = fun(X,[{X,N}|Rest]) -> [{X,N+1}|Rest]; 
     (X,Rest)   -> [{X,1}|Rest] end. 

lists:foldr(F,[],List). 
+1

'lists : foldr/3'을 사용하면 집에 있습니다. ;) –

+0

foldr로 편집 해 주셔서 감사합니다 –

+0

'lists : foldr/3'을 사용하면 역순으로 목록에 실제로 구축하지는 않습니다. 적어도 누적기를 사용하여 호출 할 때와 같은 방식이 아닙니다. : reverse/1'을 입력하십시오. 'lists : foldr'는 오른쪽에서 왼쪽으로 목록에서 작동하므로 모든 요소를 ​​역순으로 처리합니다. ** 정의 ** 할 수 있습니다. 꼬리 - 재귀 적 (tail-recursive)은 항상 그렇게 나쁜 것은 아닙니다. 이것은 문서에 언급되어 있습니다. – rvirding

2

나는 개인적으로 lists:foldr/3를 사용하거나 같은 손으로 그것을 할 것입니다 :

list_to_tuples([H|T]) -> list_to_tuples(T, H, 1); 
list_to_tuples([]) -> []. 

list_to_tuples([H|T], H, C) -> list_to_tuples(T, H, C+1); 
list_to_tuples([H|T], P, C) -> [{P,C}|list_to_tuples(T, H, 1); 
list_to_tuples([], P, C) -> [{P,C}]. 

두 개의 축전지를 사용하면 불필요하게 구축하고 목록의 모든 요소에 대해 따로 튜플을 당겨 저장합니다. 나는 그것을 더 명확하게 쓰는 것을 발견한다.

관련 문제