TreeSet和HashSet的區別在於, TreeSet可以進行排序, 默認使用字典順序排序, 也可以進行自定義排序
1, 自然排序
2, 比較器排序
自然排序:
1, 需要被排序的類實現Comparable<T>接口
2, 重寫其中的 comparato
package xfcy_04; /** * Student類 * @author wenbronk * */ public class Student implements Comparable<Student> { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Student s) { //return -1; //-1表示放在紅黑樹的左邊,即逆序輸出 //return 1; //1表示放在紅黑樹的右邊,即順序輸出 //return o; //表示元素相同,僅存放第一個元素 this.age.compareTo(s.age)return num2; } }
自定義比較器排序;
這種方法需要一個新的類實現Comparator<T>接口
重寫其中的Compare 方法
TreeSet<String> wifiSet = new TreeSet<String>(new Comparator<String>() { @Override public int compare(String o1, String o2) { JSONObject obj1 = JSON.parseObject(o1); JSONObject obj2 = JSON.parseObject(o2); return obj1.getDouble("distance").compareTo(obj2.getDouble("distance")); } });
然后, 改成函數式編程可以寫成:
Set<JSONObject> treeSet = new TreeSet<>((first, second) -> { JSONObject base1 = first.getJSONObject("base"); String[] loc1 = base1.getString("location").split(", * "); JSONObject base2 = second.getJSONObject("base"); String[] loc2 = base2.getString("location").split(", * "); Double d1 = GeoUtils.getDistance(new Point(Double.valueOf(loc1[1]), Double.valueOf(loc1[0])), new Point(lat, lng)); Double d2 = GeoUtils.getDistance(new Point(Double.valueOf(loc2[1]), Double.valueOf(loc2[0])), new Point(lat, lng)); return d1.compareTo(d2); });
然后正常往set中添加元素, 既可以實現自定義排序了