[英]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.