[英]Sort array first by length then alphabetically in Java
如何首先按長度對數組進行排序,然后按字母順序排序?
我有一個帶有數字的東西清單,我目前得到:
某物1 某物10 某物2 某物3
而我想得到:
某物1 某物2 某物3 某物10
public class MyComparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
if (o1.length() > o2.length()) {
return 1;
} else if (o1.length() < o2.length()) {
return -1;
}
return o1.compareTo(o2);
}
}
然后使用:
Collections.sort(yourList, new MyComparator());
這是一個簡潔的 Java 8 解決方案:
List<String> list = Arrays.asList("Something1", "Something10", "Something2", "Something3");
list.sort(Comparator.comparing(String::length).thenComparing(String::compareTo));
或者,不區分大小寫的版本:
list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase));
創建一個 Comparator,首先按長度進行比較,如果長度相同,則使用 String.compareTo()。
僅當字符串前綴(即數字之前的部分)在所有情況下長度相同時,首先按長度排序,然后按詞法排序才有效。 我相信您可能真的想編寫一個比較器來分隔字符串和數字部分,並在字符串上按字母順序排序,在數字部分上按數字排序。
通過使用 lambda,java 程序看起來像。
import java.util.Arrays;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
String str = "This is am example";
List<String> strl = Arrays.asList(str.split(" "));
strl.sort( (o1,o2)->{
if(o1.length() > o2.length()) return 1;
else if(o1.length() < o2.length()) return -1;
else return o1.compareTo(o2);
});
System.out.println(strl);
}
}
定義一個類來保存您的項目。似乎您希望它是一個字符串。
對於該類,您需要定義 Comparable 接口並將要比較的邏輯放在其抽象方法中。
int compareTo(T o)
例如:
class MyString extends String { @Override int compareTo(Object obj) { // put your logic in here. // Return -1 if this is "less than" obj. // Return 0 if this is equal to obj // Return 1 if this is "greater than" obj. // Test length first if (length() < obj.length()) return -1; if (length() > obj.length()) return 1; // Lengths are the same, use the alphabetical compare defined by String already return super.compareTo(obj); } }
免責聲明,我實際上並沒有測試這段代碼,但它應該接近你想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.