これを論理的にソートしようとしています次の要素を持つ文字列のリストがあるとします
String[] myList = {"Spring 2013", "Fall 2009", "Fall 2010", "Spring 2012"};
結果セットが2009年秋、2010年秋、2012年春、2013年春になる場合に、これをどのようにソートできるか知りたい
私はあなたの助けに感謝します、ありがとう!
文字列を再フォーマットできないと仮定すると、そのロジックを実装するカスタム コンパレータを作成できます。Comparatorはsplitを呼び出して、学期と年を分離します。次に、最初に年を比較し、次にカスタムの月/学期ロジックを比較できます。
リストとカスタム コンパレータを指定して Collections.sort または Arrays.sort を呼び出すことができます。
「春」や「秋」などの季節名は、年よりも「重要性が低い」ことに注意してください。
また、季節はアルファベット順ではなく、冬、春、夏、秋 (だと思いますか?) で並べ替えます。
したがって、「2010 年秋」を「20104」に、「2013 年春」を「20132」に変換すると、数値として並べ替えることができます。
この場合、目的の順序は自然な (アルファベット順) であるため、Arrays.sort(Object\[\])
メソッドを使用できます。目的の順序が自然順序と一致しない場合は、 を実装しComparator
て メソッドを使用できますArrays.sort(String\[\], Comparator<String>)
。
実装の例Comparator
(どのように機能するかを示すため):
public class SemesterComparator implements Comparator<String> {
private static final List<String> SEASONS = Arrays.asList("Spring", "Summer", "Fall", "Winter");
@Override
public int compare(String one, String two) {
String[] partsOne = one.split(" ");
String[] partsTwo = two.split(" ");
if (partsOne.length != 2 || partsTwo.length != 2) {
throw new IllegalArgumentException();
}
if (!SEASONS.contains(partsOne[0]) || !SEASONS.contains(partsTwo[0])) {
throw new IllegalArgumentException();
}
// compare years
int comparison = partsOne[1].compareTo(partsTwo[1]);
if (comparison == 0) {
// if years are equal: compare season
comparison = SEASONS.indexOf(partsOne[0]).compareTo(SEASONS.indexOf(partsTwo[0]));
}
return comparison;
}
}
ただし、コメントで既に述べたように、並べ替えが容易な形式またはクラスに値を保存することをお勧めします。