[英]Sort ArrayList of strings using regex
我有一個StringList的String值(它們需要格式化),我需要按年排序。 該列表如下:
01-05-2011
11-24-2011
01-12-2012
...
我目前按月按字母順序排序,但我想知道如何按年份排序這個字符串ArrayList。
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
是穩定的 ,因此如果您的字符串已經按月排序,並且您按年份排序,則具有相同年份的字符串組仍將按月排序。
理想情況下,您應該將列表轉換為字符串以外的其他內容列表,例如,Joda時間日期。 現在這個代碼是字符串輸入的 。 您越早接受輸入並將其強制轉換為有意義的對象,您的代碼越少,輸入假設就越少,當您的假設不完全保持時,您需要調試的代碼行越少。
我不會使用正則表達式 - 基本上你應該實現Comparator<String>
來比較任何兩個字符串。 您可以通過重新排列字符串的位(例如,以yyyyMMdd格式)然后執行字典比較來執行此操作,或者您可以將字符串解析為日期並比較兩個日期。
無論哪種方式,您都將比較器傳遞給Collections.sort()
。
請注意,此建議將完全排序 - 所以按年,然后按月,然后按天。 如果你只是在今年進行排序,他們仍然不會是一個真正的時間順序。 我個人會完全按時間順序完成它,因為這可能會在以后減少意外。
如果您使用regexp設置,請將您的字符串轉換為:
String toCompare = monthDayYearString.replaceAll(
"(\\d\\d)-(\\d\\d)-(\\d\\d\\d\\d)"
, "$3$1$2"
);
此表達式捕獲日期的元素,並重新排序它們以使更慢的元素更接近字符串的開頭。 現在可以按字母順序對字符串進行排序以對日期進行排序。
使用Collections.sort
並構建一個使用正則表達式的Comparator
。
我在這里結合了兩個建議的解決方案..
Arrays.sort(new String[] {}, new Comparator<String>() {
private final Pattern p = Pattern.compile("(\\d\\d)-(\\d\\d)-(\\d\\d\\d\\d)");
@Override
public int compare(String o1, String o2) {
Matcher m1 = p.matcher(o1);
Matcher m2 = p.matcher(o2);
int compareYear = m1.group(3).compareTo(m2.group(3));
if (compareYear == 0) {
int compareMonth = m1.group(1).compareTo(m2.group(1));
if (compareMonth == 0) {
return m1.group(2).compareTo(m2.group(2));
} else {
return compareMonth;
}
} else {
return compareYear;
}
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.