有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用正则表达式的字符串java排序ArrayList

我有一个字符串值的ArrayList(它们需要格式化),我需要按年份进行排序。列表如下所示:

01-05-2011
11-24-2011
01-12-2012
...

目前,我已经将它们按字母顺序按月排序,但我想知道如何按年份对这个字符串数组列表进行排序


共 (5) 个答案

  1. # 1 楼答案

    我在这里结合了两个建议的解决方案

    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;
                }
    
            }
        });
    
  2. # 2 楼答案

    使用Collections.sort并构建一个使用正则表达式的Comparator

  3. # 3 楼答案

    我不会为此使用正则表达式——基本上你应该实现Comparator<String>来比较任何两个字符串。您可以通过重新排列字符串的位(例如,将其转换为yyyyMMdd格式),然后执行字典比较,或者将字符串解析为日期,然后比较这两个日期

    不管是哪种方式,您都要将比较器传递到Collections.sort()

    请注意,这个建议将对它们进行完整的排序——所以按年、月、日进行排序。如果你只是按年份排序,它们仍然不会按真正的时间顺序排列。我个人倾向于完全按时间顺序来做,因为这可能会在以后引起更少的惊喜

  4. # 4 楼答案

    如果设置为使用regexp,请按如下方式转换字符串:

    String toCompare = monthDayYearString.replaceAll(
        "(\\d\\d)-(\\d\\d)-(\\d\\d\\d\\d)"
    ,   "$3$1$2"
    );
    

    这个表达式捕获日期的元素,并对它们重新排序,使变化较慢的元素更接近字符串的开头。现在字符串可以按日期按字母顺序排序

  5. # 5 楼答案

    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取一个^{},指定如何比较两个列表值。案例中的列表值是Strings。您只需按字典顺序比较每个字符串的最后4位,就完成了

    Collections.sortstable,因此如果字符串已经按月份排序,并且按年份排序,那么具有相同年份的字符串组仍将按月份排序

    不过,理想情况下,您应该将列表转换为字符串以外的列表,例如Joda time dates。现在这个代码是stringly typed。你越早接受输入并将它们强制为有意义的对象,你的代码就越不需要做出输入假设,当你的假设不太成立时,你需要调试的代码行就越少