Месяцы вида (со строками) алгоритм

У меня есть этот массив месяцев:

["January", "March", "December" , "October" ]

И я хочу отсортировать его как это:

["January", "March", "October", "December" ] 

Я в настоящее время думаю в, "если/еще" ужасный каскад, но интересно, существует ли некоторый другой способ сделать это.

Плохая часть - то, что я должен сделать это только со "строкой" (то есть, не используя объект Даты или что-либо как этот)

Каков был бы хороший подход?

6
задан OscarRyz 20 January 2010 в 00:02
поделиться

8 ответов

Если у меня был способ поставить заказ на заказ порядок сортировки, я бы создал список, определяющий правильный порядок:

correct = List("January", "February", "March", ...)

, а затем сортировать по позиции в этом списке, что-то вроде:

toSort.sort(a, b) => compare(correct.index(a), correct.index(b))
11
ответ дан 8 December 2019 в 04:29
поделиться

Создайте таблицу с именем-> Index, затем сортируйте массив на основе его значения в таблице.

Пара примеров может быть полезной, в C # ARR.SORT (MyCompare) , в Java Collections.sort (Arr, MyCompare) , в Python ARM. Сортировать (MyCompare) , в PHP USORT ($ ARR, 'MyCompare') , в C ++ сортировка (vec.begin (), vec.end (), mycompare) Отказ

9
ответ дан 8 December 2019 в 04:29
поделиться

имеют массив с правильной сортировкой, а также на основе на его основе.

Другое решение (если ваш язык поддерживает его), состоит в том, чтобы иметь ассоциативный массив с именами месяцев на номера (1..12) и используйте пользовательский компаратор, работающий на основе вашего массива.

Решение в Perl: D

my @mon = qw( January February March April May June July August September October November December );
my $mon;
@{$mon}{@mon} = (0..$#mon);

sub by_month {
    $mon->{$a} <=> $mon->{$b};
}

sort by_month @data_to_sort

(хотя я уверен, что гольфист может сделать это в <30 символов)

, а вот решение в простых C: http://www.pnambic.com /Cps/sortanal/html/monorder.html

4
ответ дан 8 December 2019 в 04:29
поделиться

Говоря от Java POV, я собираюсь в сутенер (как я часто делаю) Google-Collections (скоро будет заменен Guava ):

Arrays.sort(myMonths, Ordering.explicit("Jan", "Feb", "Mar", ....));

.. . и вы сделали.

Не пишите это сами, если кто-то еще сделал это, вероятно, более эффективно и с приятным API, чем вы, наверное, бы.

Не полезно в общем случае, но на всякий случай, когда любая Java Folk имеет ту же проблему ...

1
ответ дан 8 December 2019 в 04:29
поделиться

Добавьте префикс для каждого месяца:


Jan -> aJan
Feb -> bFeb
...

Сортировать, затем удалить префикс.

-1
ответ дан 8 December 2019 в 04:29
поделиться

Картирование:

month_map = {"January":1,
             "February":2,
             "March":3,
             "April":4} # etc..

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

ИЛИ

Большинство языков / каркасов имеют объекты для обработки дат. Создайте объекты Date для всех месяцев и сравните их, используя нативные (если имеются) операторы неравенства или базовые функции сортировки:

import datetime
January  = datetime.date(2010,1,1)
February = datetime.date(2010,2,1)
if February < January: print("The world explodes.")
0
ответ дан 8 December 2019 в 04:29
поделиться

Спасибо всем за предложения, я хотел бы отметить вас всех, как принято.

Вот результирующий код:

// correct order 
months as String[] = ["jan", "feb", "mar", "apr", "may", "jun",
                      "jul", "aug", "sep", "oct", "nov", "dec"]
// my unsorted months 
myMonths as String[] = ["mar", "dec", "jul", "jan", "sep"]

// poor substitute for Map
mappedIndex as Int[]

// create an array with the corresponding index 
for each m in myMonths do
    i as Int = 0;
    for each month in months do 
       if m == month then 
           mappedIndex[] = i // no break, so I should use "else"
       else
          i = i + 1
       end
    end
end

// At this point mapped index has the same order as my "unsorted" array
// in this case [2,11,5,0,8]

// Fortunately this language has "sort" otherwise I would jump out of the window
mappedIndex.sort()

// create a new array to hold the sorted values
myMonthsSorted as String[]

// and fill it with the correct value
for each i in mappedIndex do 
   myMonthsSorted[] = months[i]
end
0
ответ дан 8 December 2019 в 04:29
поделиться

Каждый файл .py представляет собой модуль, поэтому логические группы функций, констант и классов должны храниться вместе в одном файле.

Каждый класс в PY-файле просто создаст эпический блут в таблице модуля, так как если вы заинтересованы только в одном классе, вы по-прежнему можете

from whatever import SomeClass
-121--1850270-

Это не решение, а обходной путь : используйте git-svn в качестве локального клиента в репозитории Subversion.

-121--3206183-

В течение нескольких месяцев я просто жестко кодировал нужные мне массивы...

var correctOrdering = {
    english: ["January", "February", "March", ...],
    french: ["Janvier", "Février", "Mars", ...],
    russian: ["Январь", "февраль", "март"],
    ...
};

Не похоже, что имена месяцев скоро изменятся.

0
ответ дан 8 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: