2016-05-24 11 views
3

日付である文字列を再フォーマットしようとしています。彼らの中には初めに年があり、終わりに来る年を持つことを望みます。私はまた、区切り文字をアンダースコアに標準化したい。配列を特定の位置で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つの要素はないと思う。 Javaのドキュメントから

+0

あなたが何を求めているのかよく分かりません。例外は何が間違っているかを正確に示します。あなたはインデックス** 2 **にアクセスしようとしています。言い換えれば、 'date.split()'が3つの要素を持つ配列を作成すると仮定してはいけません。そして、なぜ、あなたは何が起こっているのかを知るためにいくつかのトレースステートメントを出力しなければならないのか、それともデバッガで実行して各値がどうなるのかを知るために他の人が必要なのですか? – GhostCat

+0

日付の解析と書式設定に 'SimpleDateFormat'を使用できます。 –

答えて

1

をフォーマットすることができると私は文字列の問題としてそれに近づくだろう、それは多くの標準日付書式を持つDateFormatUtilsを見てください日付文字列は:

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

あなたは、セパレータを保存する場合(のみあなたのコードを動作させるためにアンダースコアに変更):

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

シンプルですが美しいです。コレクションも必要ありませんでした。ただ普通のオール 'をすべて置き換えてください –

+0

@セバスチャンゼッキーありがとう。私は最終的な目標に応じてさらに単純化するかもしれない私の答えの最後に別のアプローチを追加しました。 – Bohemian

1

を挿入し、このリスト内の指定された位置に指定された要素。現在その位置にある要素(存在する場合)とそれに続く要素を右にシフトします(インデックスに1を加えます)。以下

indexそれはIndexOutOfBoundsExceptionをスローしsize又は負より大きい場合それは、明らかであるArrayList.add(index,E)メソッドのソースコード

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

あります。あなただけフォーマットしたい場合は

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()); 

はあなたが日付を

関連する問題