私は年ごとにソートする必要があるString値のArrayList(それらはフォーマットされている必要があります)を持っています。リストは以下のようになります。正規表現を使用して文字列のArrayListを並べ替え
01-05-2011
11-24-2011
01-12-2012
...
私は現在、彼らは月のアルファベット順に並べ替えられていますが、私は年によって文字列のこのArrayListのを並べ替えることができますどのように思っていました。
私は年ごとにソートする必要があるString値のArrayList(それらはフォーマットされている必要があります)を持っています。リストは以下のようになります。正規表現を使用して文字列のArrayListを並べ替え
01-05-2011
11-24-2011
01-12-2012
...
私は現在、彼らは月のアルファベット順に並べ替えられていますが、私は年によって文字列のこのArrayListのを並べ替えることができますどのように思っていました。
Collections.sort(
myList, new Comparator<String>() {
@Override
public int compare(String a, String b) {
// If a is "11-24-2012", then aLastDash points
// here ---------^.
int aLastDash = a.lastIndexOf("-");
int bLastDash = b.lastIndexOf("-");
return a.substring(aLastDash+1).compareTo(
b.substring(bLastDash+1));
}
});
Collections.sort
2つのリスト値を比較する方法を指定Comparator
をとります。あなたのケースのリストの値はString
です。各文字列の最後の4桁を辞書順に比較するだけで済みます。
Collections.sort
がstableなので、文字列がすでに月別にソートされていて、年単位で並べ替えた場合、同じ年の文字列グループは月ごとにソートされます。
しかし、理想的には、あなたのリストを文字列以外のリスト(Joda時間の日付など)に変換する必要があります。今すぐこのコードはstringly typedです。インプットを取って意味のあるオブジェクトに早期に追い込むほど、コードが少なくても、前提があまり成立しないときにデバッグしなければならないコード行の数は少なくなります。
私はこのために正規表現を使用しません - 基本的にはComparator<String>
を実装して2つの文字列を比較する必要があります。文字列のビットを(たとえばyyyyMMdd形式に)並べ替えて、辞書編集の比較を実行するか、文字列を日付として解析して2つの日付を比較するだけで、これを行うことができます。
いずれにしても、コンパレータをCollections.sort()
に渡します。
この提案は完全に並べ替えることに注意してください。年、月、日までに並べ替えてください。 ちょうど年に並べ替えても、それらはまだ実際の時系列ではありません。私は個人的にそれを完全に時系列的にやってまっすぐに行くでしょう、それは後であまり驚きを起こさない可能性が高いからです。
Collections.sort
を使用し、正規表現を使用するComparator
を作成します。
String toCompare = monthDayYearString.replaceAll(
"(\\d\\d)-(\\d\\d)-(\\d\\d\\d\\d)"
, "$3$1$2"
);
この式はあなたの日付の要素を取り込み、再注文彼らは近いの先頭に遅く変化する要素を持って:あなたは、正規表現を使用して設定されている場合
、このようなあなたの文字列を変換します文字列これで文字列をアルファベット順に並べ替えることができます。私はここで提案ソリューションの2を組み合わせました
..
Arrays.sort(new String[] {}, new Comparator<String>() {
private final Pattern p = Pattern.compile("(\\d\\d)-(\\d\\d)-(\\d\\d\\d\\d)");
@Override
public int compare(String o1, String o2) {
Matcher m1 = p.matcher(o1);
Matcher m2 = p.matcher(o2);
int compareYear = m1.group(3).compareTo(m2.group(3));
if (compareYear == 0) {
int compareMonth = m1.group(1).compareTo(m2.group(1));
if (compareMonth == 0) {
return m1.group(2).compareTo(m2.group(2));
} else {
return compareMonth;
}
} else {
return compareYear;
}
}
});
@ジョン:私は、正規表現のアプローチが好ましい方法であるとき、あなたが決めるにはどうすればよい)1を思っていた2)私は従わないのですか?文字列のビットを並び替えて辞書編集の比較を行う部分 – Cratylus
彼はちょうど意味しました:01-05-2011の代わりに2011-05-01として日付を書いてから、自然な辞書順を使用してください。それは@dasblinkenlightが示唆しているものです。これであなたのリストやコンパレータでこれを行うことができます(ただし、比較は遅くなります)。 - あなたの日付をソートするのが最も合理的な方法です。 – Guillaume
@ user384706:パターンマッチングをしたかったのです。ここには実際のパターンマッチングはありません。パターンに基づいた比較*がありますが、それは同じものではありません。 –