TreeSet方法之一 當向TreeSet中新增Person物件 續 確定按哪個屬性排序
阿新 • • 發佈:2019-02-17
package andycpp; public class Person implements Comparable { private String name; private Integer age; //get set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } //無參構造器 public Person() { super(); } //帶參構造器 public Person(String name, Integer age) { super(); this.name = name; this.age = age; } //toString @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((age == null) ? 0 : age.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (age == null) { if (other.age != null) return false; } else if (!age.equals(other.age)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } //重寫了未實現的抽象方法,方法實現了什麼功能:就是你希望按照哪個屬性來排列 //當向TreeSet中新增Person類的物件時,依據此方法,確定按照哪個屬性排列 //Person有兩個屬性name,age,這裡按照age 排序 @Override public int compareTo(Object o) { if(o instanceof Person){ //保證是Person型別的 Person p = (Person)o; // return this.name.compareTo(p.name);//name已經重寫了compareTo // return this.age.compareTo(p.age);//從小到大 return -this.age.compareTo(p.age);//從大到小 } return 0; //如果不是這個型別,就返回0, } }
package andycpp; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; import org.junit.Test; /** * Collection介面: * List介面 * ArrayList(主要的實現類) * LinkedList(對於頻繁的插入刪除操作) * Vector(古老的實現類,執行緒安全,但效率要低於ArrayList) * Set介面 儲存無序,不可重複的元素.Set中常用的方法都是Collection下定義的。 * HashSet(主要實現類) * LinkedHashSet * TreeSet * */ public class TestSet { /* * TreeSet: * 1,向TreeSet中新增的元素必須是同一個類的。型別相同 * 2,可以按照新增進集合中的元素的指定的順序遍歷。像String,包裝類等預設按照從小到大的順序遍歷。 * 3,當向TreeSet中新增自定義類的物件時,有兩種排序方法: 自然排序和定製排序 * 4,自然排序:要求自定義類實現java.lang.Comparable介面並重寫其compareTo(Object obj)方法 * 在此方法中,指明按照自定義類的哪個屬性進行排序。 * * */ @Test public void testTreeSet1(){ Set set = new TreeSet(); /* * 當Person類沒有實現Comparable介面時,當向TreeSet中新增Person物件時,報ClassCastException錯誤 * * */ set.add(new Person("CC",23)); set.add(new Person("MM",21)); set.add(new Person("GG",25)); set.add(new Person("JJ",24)); set.add(new Person("DD",20)); for(Object str :set){ System.out.println(str); } } }
輸出
Person [name=GG, age=25]
Person [name=JJ, age=24]
Person [name=CC, age=23]
Person [name=MM, age=21]
Person [name=DD, age=20]