簡體   English   中英

使用正則表達式對字符串的ArrayList進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM