2016-05-24 2 views
3

Я пытаюсь переформатировать некоторые строки, которые являются датами. У некоторых из них есть год в начале, и я бы хотел, чтобы у них был свой год. Я также хочу стандартизировать символ разделителя на знак подчеркивания.Переупорядочивание массива в массивList в определенной позиции

Пример ввода:

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

Я думаю, что год подбирается отлично, но два других элемента в массиве нет.

+0

Не уверен, что вы просите. Исключение указывает вам, что именно не так; вы пытаетесь получить доступ к индексу ** 2 **; в массиве длины 0. Другими словами: не предполагайте, что 'date.split()' создает массив с тремя элементами - проверьте его, чтобы быть уверенным. И зачем вам нужны другие люди, чтобы понять: «Может быть, я должен распечатать некоторые инструкции трассировки, чтобы увидеть, что происходит, или, или heck, запустить его в отладчике, чтобы узнать, что происходит для каждого значения» ?! – GhostCat

+0

Вы можете использовать 'SimpleDateFormat' для дат синтаксического анализа и форматирования. –

ответ

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

Простой красивый. Также не нуждался в коллекции. Просто просто ol 'заменить все –

+0

@SebastianZeki Спасибо. Я добавил еще один подход к концу моего ответа, который может упроститься в зависимости от вашей конечной цели. – Bohemian

1

От Java док

Вставляет указанный элемент в указанной позиции в этом списке. Сдвигает элемент в данный момент (если есть) и любые последующие элементы справа (добавляет один к своим индексам).

Ниже 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 он имеет множество стандартных форматов даты, с который вы можете форматировать даты