-3

これを論理的にソートしようとしています次の要素を持つ文字列のリストがあるとします

String[] myList = {"Spring 2013", "Fall 2009", "Fall 2010", "Spring 2012"};

結果セットが2009年秋、2010年秋、2012年春、2013年春になる場合に、これをどのようにソートできるか知りたい

私はあなたの助けに感謝します、ありがとう!

4

4 に答える 4

2

文字列を再フォーマットできないと仮定すると、そのロジックを実装するカスタム コンパレータを作成できます。Comparatorはsplitを呼び出して、学期と年を分離します。次に、最初に年を比較し、次にカスタムの月/学期ロジックを比較できます。

リストとカスタム コンパレータを指定して Collections.sort または Arrays.sort を呼び出すことができます。

于 2013-10-30T00:12:09.237 に答える
1

「春」や「秋」などの季節名は、年よりも「重要性が低い」ことに注意してください。

また、季節はアルファベット順ではなく、冬、春、夏、秋 (だと思いますか?) で並べ替えます。

したがって、「2010 年秋」を「20104」に、「2013 年春」を「20132」に変換すると、数値として並べ替えることができます。

于 2013-10-30T00:11:34.307 に答える
0

この場合、目的の順序は自然な (アルファベット順) であるため、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;
    }
}

ただし、コメントで既に述べたように、並べ替えが容易な形式またはクラスに値を保存することをお勧めします。

于 2013-10-30T00:12:46.163 に答える