在 Java 集合框架中,TreeSet 依賴 Comparable 或 Comparator 實現元素排序。預設情況下,字符串按字典序排序(如 "15" < "2"),若需實現數值大小的自然排序(2 < 15),需自定義比較邏輯。
原代碼中 Demo 類實現 Comparable 但 compareTo 恆返回 1,導致排序失效;SortByNum 的 compare 方法邏輯混亂,雙重迴圈且未正確比較數值大小。
核心邏輯:先比較字符串長度(長度短者數值小),長度相同則按字典序比較(此時等價於數值比較)。
import java.util.*;
class Demo implements Comparable {
String str;
public Demo(String str) { this.str = str; }
public String getStr() { return str; }
public void setStr(String str) { this.str = str; }
@Override
public String toString() { return " " + this.str; }
@Override
public int compareTo(Demo other) {
String s1 = this.str;
String s2 = other.getStr();
// 先比長度
if (s1.length() != s2.length()) {
return s1.length() - s2.length();
}
// 長度相同按字典序(等同數值序)
return s1.compareTo(s2);
}
}
class SortByNum implements Comparator {
@Override
public int compare(Demo d1, Demo d2) {
return d1.compareTo(d2); // 直接複用 Demo 的比較邏輯
}
}
public class TreeSets {
public static void main(String[] args) {
TreeSet tree = new TreeSet<>(new SortByNum());
String input = "8 10 15 2 5 7";
for (String s : input.split(" ")) {
tree.add(new Demo(s));
}
System.out.println(tree); // 輸出: 2 5 7 8 10 15
}
}
Comparable 避免強制轉型Comparator 直接委託給 Comparable 實現,減少代碼重複split(" ") 解析輸入字符串此方案完美解決字符串形式數字的自然排序問題,代碼簡潔且效率高。