2010-12-07 2 views
3

У меня проблема с сортировкой двух связанных, но отдельных списков списков кортежей. Один список состоит из списков кортежей, представляющих сообщение в блоге. Другой список состоит из списков кортежей, представляющих комментарий.Erlang: функция сортировки или упорядочения списков списков сортиментов

Проблема в том, что вам нужен тот же заказ, что и на значение id блога. Списки для сообщений в блогах сортируются по значению даты. Так что вы не можете просто отсортировать численно с помощью блога id для блога и комментария. И вы, , не можете просто сортировать сообщение для комментариев через значение даты, потому что значения даты блога и связанного комментария могут отличаться.

Я не уверен, как подойти к проблеме - по крайней мере, не изящно.

Должен ли я использовать lists:nth и, следовательно, получить каждый список кортежей и значение позиции? Тогда я получаю значение id блога, Тогда я бы поискал в списке для комментариев сообщений для этого id. Получите значение этого списка кортежей. Свяжите значение этого списка кортежей в новом списке с соответствующим значением n-й позиции.

Должен ли я использовать функцию lists:sort?

Любые предложения с образцами кода, которые были высоко оценены.

Вот два примера списков списков кортежей, которые могут быть использованы в качестве основы:

[[{<<"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">>}]] 

и желаемого выхода заключается в следующем с первым списком без изменений и второго список переупорядоченный:

[[{<<"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">>}]] 

ответ

3

Хорошо, новая попытка потом :)

Мы имеем:

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

Основные экспортируемые модулем, чтобы проверить вещь

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">>}]]. 

Ваше определение блогов.

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">>}]]. 

Ваше определение комментариев.

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">>}]]. 

Ваше определение сортировки.

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

Извлеките все значения blog_id из блогов.

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

Номер заказа, в котором находятся блоги. Заполните их в dict для быстрого поиска позже.

%% 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, 

Эта функция сравнивает два Комментарии, I, J друг с другом на основе их соответствующих blog_id.

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

Верните то, что мы хотим вернуть.

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

Tester функция.

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

спасибо за сообщение, но на самом деле сортировка по блогу id не значение даты. комментарий, основанный на старшем сообщении в блоге, может быть более поздним, чем комментарий в новом сообщении в блоге. и не может сортировать идентификатор блога численно, что я считаю списком: сортировка ограничена? – 2010-12-07 19:02:02

Смежные вопросы