如何根据某些子串排序字符串?

时间:2016-02-11 22:49:42

标签: java string sorting

我有ArrayList<String>。列表中的条目可以是以下形式:

42356_11_1_9345668
562834_12_1_8674852_8
52423_4_2_586284_2
5234_13_9_535567

如您所见,中间部分包含日期:xx_y是日期和月份。左边和右边的其他值可以是任意长度。有些字符串有一个最后一个数字。

我想先根据月份(y在xx_y中)然后根据日期(xx在xx_y中)对列表进行排序。当然,月份和日期可能相等。在这种情况下,还应根据月份后的数字进行排序(例如第二个例子中的8674852)。

如何做到这一点?如果使用其他数据结构更容易,这很好,我很灵活。

2 个答案:

答案 0 :(得分:1)

如果你可以把它们放到其他数据结构中,你肯定应该。每当你想用它做一些事情时解析一个字符串是痛苦的。

public class Entry implements Comparable<Entry>    // Pick a more descriptive name
{
    int firstNumber;
    int month;
    int day;
    int lastNumber;

    public int compareTo(Entry other)
    {
        int comparison = month - other.month;
        if (comparison == 0)
            comparison = day - other.day;
        return comparison;
    }
}

列出这些条目,然后使用Collections方法对其进行排序:

Collections.sort(list);

答案 1 :(得分:1)

给出以下Entry类:

public class Entry{
   public String getItem(){...}
   public MonthDay getMonthDay(){...}
   public int getNumber(){...}

   public static Entry parseItem(String item){...}
}

您可以使用以下(未经测试!):

List<String> sortedItems = items.stream()
    .map(Entry::parseItem)
    .sort(Comparator.comparing(Entry::getMonthDay)
              .thenComparingInt(Entry::getNumber))
    .map(Entry::getItem)
    .collect(Collectors.toList);