web-dev-qa-db-ja.com

Aがaの前に、Bがbの前にくるカスタムソート

私はこのような色のリストを持っています:

ピンク、ブルー、レッド、ブルー、グレー、グリーン、パープル、ブラック...など

List<String> listOfColors =  Arrays.asList("Pink", "Blue", "Red", "blue", "Grey", "green", "purple", "black");

いくつかの果物の色のフィルタリングのようないくつかの中間的な操作があります。今、私はそれらを順番に並べ替えたいフィルタリングされた結果を残しています:

ブルー、ブラック、ブルー、グレー、グリーン、ピンク、パープル、レッド

私が試してみました :

List<String> collect = listOfColors.stream().sorted(String::compareToIgnoreCase)
        .collect(Collectors.toList());

期待どおりに動作しません。

出力は次のとおりです。

ブラック、ブルー、ブルー、グリーン、グレー、ピンク、パープル、レッド

私は以下が欲しい:

ブルー、ブラック、ブルー、グレー、グリーン、ピンク、パープル、レッド

11
Vishwa Ratna

最初に各文字で大文字と小文字を区別しない比較を行うメソッドが必要です。次に一致がある場合は、各文字で大文字と小文字を区別する比較を実行します。

public static int compare(String s1, String s2)
{
    int len, i;
    if (s1.length()<s2.length()) {
        len = s1.length();
    } else {
        len = s2.length();
    }
    for (i=0;i<len;i++) {
        if (Character.toUpperCase(s1.charAt(i)) < Character.toUpperCase(s2.charAt(i))) {
            return -1;
        } else if (Character.toUpperCase(s1.charAt(i)) > Character.toUpperCase(s2.charAt(i))) {
            return 1;
        } else if (s1.charAt(i) < s2.charAt(i)) {
            return -1;
        } else if (s1.charAt(i) > s2.charAt(i)) {
            return 1;
        }
    }
    if (s1.length() < s2.length()) {
        return -1;
    } else if (s1.length() > s2.length()) {
        return 1;
    } else {
        return 0;
    }
}

その後、このメソッドをStream.sortedに渡すことができます。

0
dbush