2017-09-09 4 views
2

Erlang Newbie ici. Supposons que j'ai deux listes qui sont comme ça.Erlang - Articles communs à partir de deux listes

L1= [{'Lady in the Water',2.5}, 
     {'Snakes on a Plane',3.5}, 
     {'Just My Luck',3.0}, 
     {'Superman Returns',3.5}, 
     {'You, Me and Dupree',2.5}, 
     {'The Night Listener',3.0}] 

et

L2 = [{'Lady in the Water',3.0}, 
     {'Snakes on a Plane',3.5}, 
     {'Just My Luck',1.5}, 
     {'Superman Returns',5.0}, 
     {'You, Me and Dupree',3.5}] 

Je veux les notes communes dans une liste de tuple comme

[{2.5,3.0},{3.5,3.5},{3.0,1.5},{3.5,5.0},{2.5,3.5}] 

Mon code est comme ce

common_rating(R1,R2)->common_rating(R1,R2,0,0). 

common_rating(_X,[],M,N) ->{M,N}; 



common_rating(X,[Y|Y1],A,B)-> 
    {M,R}=X, 
    {N,K }= Y, 
    case M=/=N of 
    true -> common_rating(X,Y1,A,B); 
    false -> common_rating(X,[],A+R,B+K) 
    end. 

common_rating_final([],_R2,J) ->J; 
common_rating_final([X|X1],R2,J)-> 
    common_rating_final(X1,R2,J++[common_rating(X,R2)]). 

Pour mieux comprendre le code fonction common_rating attend un tuple de {movie,rating} et trouve le même film et note d'une autre liste (B) et retourne {rating,rating_B}

Maintenant common_rating_final va récursive sur une liste, permet de dire A et utilise common_rating pour trouver {rating_A, rating_B} pour tous les films qui sont communs dans A et B à la fois

mais quand je lance mon code

my_module:common_rating_final(L1,L2,[]). 

il me retourne

[{2.5,3.0},{3.5,3.5},{3.0,1.5},{3.5,5.0},{2.5,3.5},{0,0}] 

Je peux filtrer la partie {0,0} mais je pense que ma logique est défectueuse mais je n'ai pas pu écrire un code qui renvoie uniquement les cotes communes sans la partie {0,0}. Veuillez nous aider.

Répondre

7

TL; DR

[{X2, Y2} || {X1, X2} <- L1, {Y1, Y2} <- L2, X1 =:= Y1].


Peut-être que les "fissures" ici peut trouver une meilleure solution (plus efficace, etc.), mais celui-ci fonctionne. Fondamentalement, il correspond ("déconstruit") le L s et compare le premier élément des tuples, renvoyant le second élément si les premiers sont égaux.

Toute substance/preuve:

[email protected]:~$ erl 
Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false] 

Eshell V8.3 (abort with ^G) 
1> L1= [{"Lady in the Water",2.5}, {"Snakes on a Plane",3.5}, {"Just My Luck",3.0}, {"Superman Returns",3.5}, {"You, Me and Dupree",2.5}, {"The Night Listener",3.0}]. 
[{"Lady in the Water",2.5}, 
{"Snakes on a Plane",3.5}, 
{"Just My Luck",3.0}, 
{"Superman Returns",3.5}, 
{"You, Me and Dupree",2.5}, 
{"The Night Listener",3.0}] 
2> L2 = [{"Lady in the Water",3.0}, {"Snakes on a Plane",3.5}, {"Just My Luck",1.5}, {"Superman Returns",5.0}, {"You, Me and Dupree",3.5}]. 
[{"Lady in the Water",3.0}, 
{"Snakes on a Plane",3.5}, 
{"Just My Luck",1.5}, 
{"Superman Returns",5.0}, 
{"You, Me and Dupree",3.5}] 
3> [{X2, Y2} || {X1, X2} <- L1, {Y1, Y2} <- L2, X1 =:= Y1]. 
[{2.5,3.0},{3.5,3.5},{3.0,1.5},{3.5,5.0},{2.5,3.5}] 
4> 

Notez que j'ai changé les atomes en chaînes (il fonctionne de la même manière que).

+0

Très bien J'essayais de comprendre la liste mais je n'arrivais pas à trouver de multiples listes. Merci . – Bg1850

+0

Une chose que je devrais obtenir, j'ai essayé votre solution avec X == Y et cela a fonctionné. Quelle est la différence . – Bg1850

+2

Veuillez vérifier [documentation] (http://erlang.org/doc/reference_manual/expressions.html#id81316) ou [stackoverflow] (https://stackoverflow.com/questions/9790815/what-is-the-difference- entre-et-dans-erlang-quand-utilisé-avec-termes-dans-gène) – mpm