2016-02-11 67 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实用程序的速度...... –

相关问题