カスタムソートが邪魔にAが前に来ることとBはBの前に来ます

Vishwaラトナ:

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

ピンク、ブルー、レッド、ブルー、グレー、グリーン、パープル、黒...等

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

いくつかの中間の操作は、今私は、私はそれらを順にソートしたいフィルタ結果が残っています、いくつかの果物の色をフィルタリングのようにあります。

青、黒、青、グレー、グリーン、ピンク、パープル、レッド

私が試してみました :

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

期待通りには動作しません。

出力は以下の通りであります:

黒、青、青、緑、グレー、ピンク、パープル、レッド

私は次のことをしたいです:

青、黒、青、グレー、グリーン、ピンク、パープル、レッド

DanielBK:

私の解決策を使用して、2つのステップで並べ替えを使用することであるComparator.thenComparing()方法を。

まず、ケースのみを無視し、最初の文字で文字列を比較します。だから、同じ最初の文字(何があった場合)とのグループは、これまでにソートされていないまま。そして、第二段階では、これらのソートされていないサブグループをソートするために、通常のアルファベット順のソートを適用します。

List<String> listOfColors =  Arrays.asList("Pink", "Blue", "Red", "blue", "Grey", "green", "purple", "black");
Comparator<String> comparator = Comparator.comparing(s -> 
        Character.toLowerCase(s.charAt(0)));
listOfColors.sort(comparator.thenComparing(Comparator.naturalOrder()));
System.out.println(listOfColors);

多分それはまだ最適化することができますが、それは望ましい結果が得られます。

[Blue, black, blue, Grey, green, Pink, purple, Red]

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=6245&siteId=1