У меня есть этот массив месяцев:
["January", "March", "December" , "October" ]
И я хочу отсортировать его как это:
["January", "March", "October", "December" ]
Я в настоящее время думаю в, "если/еще" ужасный каскад, но интересно, существует ли некоторый другой способ сделать это.
Плохая часть - то, что я должен сделать это только со "строкой" (то есть, не используя объект Даты или что-либо как этот)
Каков был бы хороший подход?
Если у меня был способ поставить заказ на заказ порядок сортировки, я бы создал список, определяющий правильный порядок:
correct = List("January", "February", "March", ...)
, а затем сортировать по позиции в этом списке, что-то вроде:
toSort.sort(a, b) => compare(correct.index(a), correct.index(b))
Создайте таблицу с именем-> Index, затем сортируйте массив на основе его значения в таблице.
Пара примеров может быть полезной, в C # ARR.SORT (MyCompare)
, в Java Collections.sort (Arr, MyCompare)
, в Python ARM. Сортировать (MyCompare)
, в PHP USORT ($ ARR, 'MyCompare')
, в C ++ сортировка (vec.begin (), vec.end (), mycompare)
Отказ
имеют массив с правильной сортировкой, а также на основе на его основе.
Другое решение (если ваш язык поддерживает его), состоит в том, чтобы иметь ассоциативный массив с именами месяцев на номера (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
Говоря от Java POV, я собираюсь в сутенер (как я часто делаю) Google-Collections (скоро будет заменен Guava ):
Arrays.sort(myMonths, Ordering.explicit("Jan", "Feb", "Mar", ....));
.. . и вы сделали.
Не пишите это сами, если кто-то еще сделал это, вероятно, более эффективно и с приятным API, чем вы, наверное, бы.
Не полезно в общем случае, но на всякий случай, когда любая Java Folk имеет ту же проблему ...
Добавьте префикс для каждого месяца:
Jan -> aJan
Feb -> bFeb
...
Сортировать, затем удалить префикс.
Картирование:
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.")
Спасибо всем за предложения, я хотел бы отметить вас всех, как принято.
Вот результирующий код:
// 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
Каждый файл .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: ["Январь", "февраль", "март"],
...
};
Не похоже, что имена месяцев скоро изменятся.