1 回答

TA貢獻1827條經驗 獲得超8個贊
對字符串使用默認排序將使用字典順序,而您打算按數字順序對字符串進行排序(如果第一個數字相等,則按第二個數字排序)。實現此目的的一種方法是使用兩個比較器:
List<String> list = new ArrayList<>(Arrays.asList("96-1","91","94-2","100-2","94-1","95"));
System.out.println("Unsorted: "+list);
Comparator<String> primaryComparator =
? (a,b)->Integer.valueOf(a.split("-")[0])
? ? ? ? ? .compareTo(Integer.valueOf(b.split("-")[0]));
Comparator<String> secondaryComparator =
? (a,b)->Integer.valueOf(a.split("-")[1])
? ? ? ? ? .compareTo(Integer.valueOf(b.split("-")[1]));
list.sort(primaryComparator.thenComparing(secondaryComparator));
System.out.println("Sorted: "+list);
list.sort(primaryComparator.thenComparing(secondaryComparator).reversed());
System.out.println("Sorted in reverse: "+list);
至于比較器本身,我假設列表中的字符串始終有效,并且始終采用 形式\d+(-\d+)?,因此要么是一個整數,要么是兩個用連字符分隔的整數。(如果不是這種情況,您可能需要使用自定義 Java 7 樣式比較器添加一些額外的檢查/驗證,以使其比 Java 8 樣式的 lambda 更具可讀性。)
/.split("-")[0]將.split("-")[1]在連字符上拆分此字符串,并根據比較器獲取第一個或最后一個整數。然后它會將其轉換為帶有 的整數Integer.valueOf(...),并將使用內置的默認整數進行比較Integer1.compareTo(Integer2)。
添加回答
舉報