我有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)。
如何做到这一点?如果使用其他数据结构更容易,这很好,我很灵活。
答案 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);