首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java TreeSet 實現字符串數字自然排序的完整方案

     編輯:程式設計疑難解答

在 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(" ") 解析輸入字符串

此方案完美解決字符串形式數字的自然排序問題,代碼簡潔且效率高。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved