Collections.sort(
myList, new Comparator<String>() {
@Override
public int compare(String a, String b) {
// If a is "11-24-2012", then aLastDash points
// here ---------^.
int aLastDash = a.lastIndexOf("-");
int bLastDash = b.lastIndexOf("-");
return a.substring(aLastDash+1).compareTo(
b.substring(bLastDash+1));
}
});
Collections.sort
принимает Comparator
, который определяет, как сравнивать два значения списка. Значения в вашем случае: String
s. Вы можете просто сравнить последние 4 цифры каждой строки лексикографически, и все готово.
Collections.sort
stable, так что если ваши строки уже отсортированы по месяцам, и вы сортируете по годам, группы строк с тем же годом по-прежнему будут отсортированы по месяцам.
В идеале, вы должны преобразовать свой список в список чего-то другого, кроме строк, например, даты дат Joda. Сейчас этот код stringly typed. Чем раньше вы вносите данные и принуждаете их к значимым объектам, тем меньше ваш код должен делать входные предположения тем меньше строк кода, которые вы должны отлаживать, когда ваши предположения не совсем удержаны.
@John: Мне было интересно: 1) Как вы решаете, когда регулярное выражение подход является предпочтительным способом 2) Я не следовать? часть «перестановки битов строки и последующего выполнения лексикографического сравнения» – Cratylus
Он имел в виду: сначала напишите ваши даты как 2011-05-01, а не 01-05-2011, затем используйте естественный лексикографический порядок. Это то, что предлагает @dasblinkenlight. Теперь вы можете сделать это в своем списке или в вашем компараторе (но сравнение будет медленнее). И я согласен, это был бы самый разумный способ сортировки ваших дат. – Guillaume
@ user384706: Я бы использовал регулярное выражение, когда Я хотел выполнить сопоставление образцов. Здесь нет реального соответствия шаблону - на шаблоне есть сравнение *, но это не одно и то же. –