Erlang: функция сортировки или упорядочения списка списков кортежей - PullRequest
3 голосов
/ 07 декабря 2010

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

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

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

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

Должен ли я использовать списки : sort function?

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

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

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

1 Ответ

3 голосов
/ 07 декабря 2010

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

У нас есть:

-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)))]),

Пронумеруйте порядок появления блогов. Сложите их в столбец для быстрого поиска позже.

    %% 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()).

Функция тестера.

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