2010-12-07 8 views
3

J'ai du mal à trier deux listes de listes de tuple liées mais séparées. Une liste est composée de listes de tuples représentant un article de blog. L'autre liste est composée de listes de tuples représentant un commentaire.Erlang: Fonction de tri ou de classement pour la liste des listes de tuples

Le problème est lorsque vous souhaitez la même commande basée sur valeur d'ID de blog. Les listes des articles de blog sont triées via la valeur de la date. Donc vous ne pouvez pas trier numériquement via l'ID de blog pour le blog et le commentaire. Et vous ne peut pas simplement trier le message de commentaire via la valeur de date car les valeurs de date du blog et du commentaire associé peuvent être différentes.

Je ne sais pas comment aborder le problème - du moins pas de manière élégante.

Dois-je utiliser lists:nth et, par conséquent, obtenir chaque liste de tuples et chaque valeur de position? Ensuite, je voudrais obtenir la valeur de l'id de blog, alors je chercherais dans la liste pour les messages de commentaire pour cet id. Obtenez la valeur de cette liste de tuple. Associez la valeur de cette liste de tuples dans une nouvelle liste avec la nième valeur de position appropriée.

Dois-je utiliser la fonction lists:sort?

Toutes les suggestions avec des échantillons de code très appréciés.

Voici deux listes d'échantillons de listes de tuple qui peuvent être utilisés en tant que base:

[[{<<"blog_id">>,<<"a2">>}, 
    {<<"postDate">>,<<"2010-12-4T6:10:12">>}, 
    {<<"message">>,<<"la di da bo di do">>}], 
[{<<"blog_id">>,<<"b8">>}, 
    {<<"postDate">>,<<"2009-12-3T10:09:33">>}, 
    {<<"message">>,<<"that is cool">>}], 
[{<<"blog_id">>,<<"a9">>}, 
    {<<"postDate">>,<<"2009-12-2T18:12:29">>}, 
    {<<"message">>,<<"i like san francisco">>}]] 


[[{<<"comment_id">>,<<"n6">>}, 
    {<<"related_blog_id">>,<<"b8">>}, 
    {<<"postDate">>,<<"2010-12-5T15:10:12">>}, 
    {<<"message">>,<<"yup really neat">>}], 
[{<<"comment_id">>,<<"y2">>}, 
    {<<"related_blog_id">>,<<"a9">>}, 
    {<<"postDate">>,<<"2009-12-6T10:09:33">>}, 
    {<<"message">>,<<"yes but rent is expensive">>}], 
[{<<"comment_id">>,<<"x4">>}, 
    {<<"related_blog_id">>,<<"a2">>}, 
    {<<"postDate">>,<<"2009-12-5T16:12:29">>}, 
    {<<"message">>,<<"sounds like a hit">>}]] 

et la sortie souhaitée est la suivante avec la première liste liste inchangée et deuxième réordonnés:

[[{<<"blog_id">>,<<"a2">>}, 
    {<<"postDate">>,<<"2010-12-4T6:10:12">>}, 
    {<<"message">>,<<"la di da bo di do">>}], 
[{<<"blog_id">>,<<"b8">>}, 
    {<<"postDate">>,<<"2009-12-3T10:09:33">>}, 
    {<<"message">>,<<"that is cool">>}], 
[{<<"blog_id">>,<<"a9">>}, 
    {<<"postDate">>,<<"2009-12-2T18:12:29">>}, 
    {<<"message">>,<<"i like san francisco">>}]] 


[ [{<<"comment_id">>,<<"x4">>}, 
    {<<"related_blog_id">>,<<"a2">>}, 
    {<<"postDate">>,<<"2009-12-5T16:12:29">>}, 
    {<<"message">>,<<"sounds like a hit">>}], 
[{<<"comment_id">>,<<"n6">>}, 
    {<<"related_blog_id">>,<<"b8">>}, 
    {<<"postDate">>,<<"2010-12-5T15:10:12">>}, 
    {<<"message">>,<<"yup really neat">>}], 
[{<<"comment_id">>,<<"y2">>}, 
    {<<"related_blog_id">>,<<"a9">>}, 
    {<<"postDate">>,<<"2009-12-6T10:09:33">>}, 
    {<<"message">>,<<"yes but rent is expensive">>}]] 

Répondre

3

Ok, alors essayez nouveau :)

Nous avons:

-module(foo). 
-compile(export_all). 

exportations de module de base pour tester la chose

blogs() -> 
    [[{<<"blog_id">>,<<"a2">>}, 
     {<<"postDate">>,<<"2010-12-4T6:10:12">>}, 
     {<<"message">>,<<"la di da bo di do">>}], 
    [{<<"blog_id">>,<<"b8">>}, 
     {<<"postDate">>,<<"2009-12-3T10:09:33">>}, 
     {<<"message">>,<<"that is cool">>}], 
    [{<<"blog_id">>,<<"a9">>}, 
     {<<"postDate">>,<<"2009-12-2T18:12:29">>}, 
     {<<"message">>,<<"i like san francisco">>}]]. 

Votre définition de blogs.

comments() -> 
    [[{<<"comment_id">>,<<"n6">>}, 
     {<<"related_blog_id">>,<<"b8">>}, 
     {<<"postDate">>,<<"2010-12-5T15:10:12">>}, 
     {<<"message">>,<<"yup really neat">>}], 
    [{<<"comment_id">>,<<"y2">>}, 
     {<<"related_blog_id">>,<<"a9">>}, 
     {<<"postDate">>,<<"2009-12-6T10:09:33">>}, 
     {<<"message">>,<<"yes but rent is expensive">>}], 
    [{<<"comment_id">>,<<"x4">>}, 
     {<<"related_blog_id">>,<<"a2">>}, 
     {<<"postDate">>,<<"2009-12-5T16:12:29">>}, 
     {<<"message">>,<<"sounds like a hit">>}]]. 

Votre définition de commentaires.

sorted_comments() -> 
    [[{<<"comment_id">>,<<"x4">>}, 
     {<<"related_blog_id">>,<<"a2">>}, 
     {<<"postDate">>,<<"2009-12-5T16:12:29">>}, 
     {<<"message">>,<<"sounds like a hit">>}], 
     [{<<"comment_id">>,<<"n6">>}, 
     {<<"related_blog_id">>,<<"b8">>}, 
     {<<"postDate">>,<<"2010-12-5T15:10:12">>}, 
     {<<"message">>,<<"yup really neat">>}], 
     [{<<"comment_id">>,<<"y2">>}, 
     {<<"related_blog_id">>,<<"a9">>}, 
     {<<"postDate">>,<<"2009-12-6T10:09:33">>}, 
     {<<"message">>,<<"yes but rent is expensive">>}]]. 

Votre définition d'être trié.

sort(Blogs, Comments) -> 
    %% Create list of blog id's 
    Bs = [proplists:get_value(<<"blog_id">>, B) || B <- Blogs], 

Récupère toutes les valeurs blog_id des Blogs.

%% Create the numbering 
    DB = dict:from_list([Item || Item <- lists:zip(Bs, 
          lists:seq(1, length(Bs)))]), 

Numéro de l'ordre dans lequel les blogs se produisent. Stuff ces dans un dict pour la recherche rapide plus tard.

%% Sorter function: 
    F = fun(I, J) -> 
     II = proplists:get_value(<<"related_blog_id">>, 
        I), 
     JJ = proplists:get_value(<<"related_blog_id">>, 
        J), 
     dict:fetch(II, DB) =< dict:fetch(JJ, DB) 
    end, 

Cette fonction compare deux commentaires, I, J les uns aux autres en fonction de leur blog_id connexe.

{Blogs, lists:sort(F, Comments)}. 

Retournez ce que nous voulons retourner.

sort_test() -> 
    {blogs(), sorted_comments()} == sort(blogs(), comments()). 

Fonction testeur.

2> c(foo). 
{ok,foo} 
3> foo:sort_test(). 
true 
+0

merci pour la publication, mais en fait le tri par ID de blog pas de valeur de date. Un commentaire basé sur un article de blog plus ancien peut être plus récent qu'un commentaire sur un article de blog récent. et ne peut pas trier id numériquement blog qui est ce que je pense que les listes: le tri est limité à faire? –

+0

Voir la différence entre 'lists: sort/1' et' lists: sort/2'. Ce dernier prend une fonction d'ordre arbitraire. –

+0

Mais la fonction de tri elle-même doit prendre un élément d'une autre liste. Mais, il semble que vous ne pouvez prendre des éléments de la même liste. Obtenir la valeur de chaque élément pour chaque liste à comparer est ce que j'ai des problèmes avec la première place. –

Questions connexes