将数组重新排序到某个位置的arrayList中

时间:2016-05-24 07:57:17

标签: java arrays string date arraylist

我正在尝试重新格式化一些日期字符串。他们中的一些人在开始的那一年有一年,我希望他们的年份能够结束。我还想将分隔符标准化为下划线。

示例输入:

07_April_2008
16_05_2012
2016-01-28
14/12/2009

期望的输出:

07_April_2008
16_05_2012
01_28_2016
14_12_2009

这是我的第一次尝试,但是当我这样做时出现错误:

public String format(String date) {
    String[] format = null;
    date = date.replace("-", "_");
    date = date.replace("/", "_");
    if (date.contains("_")) {
        format = date.split("_");
        // new arrayList to add rearrangement to
        ArrayList<String> formatNew = new ArrayList<String>();
        for (int i = 0; i < format.length; i++) {
            if (format[i].matches("\\d{4}")) {
                formatNew.add(2, format[i]);
            } else {
                formatNew.add(format[i]);
            }
        }
    }
    return date;
}

这会产生错误:

  

java.lang.IndexOutOfBoundsException:Index:2,Size:0

我认为这一年很好,但数组中的其他两个元素没有。

2 个答案:

答案 0 :(得分:1)

来自Java doc

将指定元素插入此列表中的指定位置。将当前位置的元素(如果有)和任何后续元素向右移动(在其索引中加1)。

以下是ArrayList.add(index,E)方法源代码

public void add(int index, E element) {
if (index > size || index < 0)
    throw new IndexOutOfBoundsException(
    "Index: "+index+", Size: "+size);
...

所以很明显,如果index大于size或否定则会IndexOutOfBoundsException

查看DateFormatUtils它有多种标准日期格式,您可以格式化日期

答案 1 :(得分:1)

我会将其视为字符串问题:

List<String> dates; // given this
dates = dates.stream()
    .map(s -> s.replaceAll("\\W", "_")) // anything not a letter or number becomes _
    .map(s -> s.replaceAll("(\\d{4})_(.*)", "$2_$1")) // reorganise leading year dates
    .collect(Collectors.toList());

如果您只想格式化日期字符串:

str.replaceAll("\\W", "_").replaceAll("(\\d{4})_(.*)", "$2_$1")

如果要保留分隔符(仅更改为下划线以使代码正常工作):

str.replaceAll("(\\d{4})(.)(.*)", "$3$2$1")