簡體   English   中英

按自定義順序對Arraylist進行排序

[英]Sorting Arraylist in a custom order

謝謝您抽出寶貴的時間:)

我有一段代碼使用compareToIgnoreCase對Arraylist進行排序。

Collections.sort(als,new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            //I want to alter this part
            int dif=o1.compareToIgnoreCase(o2); 
            return dif;
        }


    });

但是我想以以下方式對arraylist進行排序:

輸入:(以任何順序)

sherin
Sherin
SHERIN
bubBle
buBble
BUBBLE
heart
hEart
hEArt

輸出:

BUBBLE
buBble
bubBle
hEArt
hEart
heart
SHERIN
Sherin
sherin

你能幫我這個忙嗎? 提前致謝 :)

您的第一次嘗試還不錯,但是如果不區分大小寫的值相似,則需要添加另一個比較:

Stream.of("sherin", "Sherin", "SHERIN", "bubBle", "buBble", "BUBBLE", "heart", "hEart", "hEArt")
    .sorted((s1, s2) -> {
        int tmp = s1.compareToIgnoreCase(s2); 
        return tmp == 0 ? 
            s1.compareTo(s2) //Compare equivalent values based on the case (upper case first)
            : tmp;
    }).forEach(System.out::println);

提供給Stream.sorted的比較器與您的實現相同,但使用的是lambda表示法。

結果:

BUBBLE
buBble
bubBle
hEArt
hEart
heart
SHERIN
Sherin
sherin

編輯:感謝喬普·艾根Joop Eggen)使用比較器裝飾器的建議:

Comparator
    .comparing(Function.identity(), String::compareToIgnoreCase)
    .thenComparing(Function.identity(), String::compareTo);

這樣使用起來會更清潔,並得到相同的結果:

Stream.of("sherin", "Sherin", "SHERIN", "bubBle", "buBble", "BUBBLE", "heart", "hEart", "hEArt").sorted(
        Comparator
            .comparing(Function.identity(), String::compareToIgnoreCase)
            .thenComparing(Function.identity(), String::compareTo)
    ).forEach(System.out::println);

我可以用這種表示法做的更短的是:

Comparator.comparing((String s) ->.toLowerCase()).thenComparing(Function.identity())
    public int compare(String s1, String s2) {
        int n1 = s1.length();
        int n2 = s2.length();
        int min = Math.min(n1, n2);
        for (int i = 0; i < min; i++) {
            char c1 = s1.charAt(i);
            char c2 = s2.charAt(i);
            char u1 = Character.toUpperCase(c1);
            char u2 = Character.toUpperCase(c2);
            char l1 = Character.toLowerCase(c1);
            char l2 = Character.toLowerCase(c2);

            if (u1 != u2) {
                return u1 - u2;
            } else {
                if (l1 != l2) {
                    return l1 - l2;
                } else if (c1 != c2) {
                    return c1 - c2;
                }
            }
        }
        return n1 - n2;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM