2016-02-11 64 views
1

我有一個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

查看Java S使用[Collection Class](http://stackoverflow.com/questions/6957631/sort-java-collection)。創建一個代表這個數據結構的新類可能是值得的,而不是字符串。這種比較可能會更快。 – JCOC611

回答

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.sort(list); 
+0

除非您知道數字總是介於0到Integer.MAX_VALUE之間的數字,否則不要將'int'用於'firstnumber'和'lastnumber'。在這裏使用'int'完全等價於「它是1966年,因爲我們還沒有想到Y2K,因此一年只使用兩位數」 –

+0

這只是一個快速示例,顯示如何創建自定義數據類型並對多個領域。 –

+0

非常感謝你的例子。這對分類非常有用,但是如果我想直接訪問特定月份和日期的條目,該怎麼辦?我是否必須迭代整個排序列表? – machinery

1

鑑於以下條目類:

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); 
+0

我絕對需要加快Java 8實用程序的速度...... –

相關問題