集合之Set【TreeSet】
阿新 • • 發佈:2022-12-12
package com.Lucky; import java.util.Iterator; import java.util.TreeSet; /** * TreeSet:底層採用紅黑樹結構 * 可排序【預設從小到大】/無重複/無索引 * * * 注意點:1.在資料型別為數字型時,仍然按照從小到大排序 * 2.在資料型別為char或String型別時,會根據ASCll編碼的數字大小排序【跟字典的26個字母排序相同】 * */ public class TreeSetDemo { public static void main(String[] args) { //建立TreeSet集合 TreeSet<Integer> ts=new TreeSet<>(); TreeSet<TestDemo> tsStudent=new TreeSet<>(); //新增元素 ts.add(1); ts.add(5); ts.add(9); ts.add(4); ts.add(2); //遍歷輸出 Iterator<Integer> ite = ts.iterator(); while (ite.hasNext()){ System.out.print(ite.next()+"\t"); //自動從小到大進行排序 } System.out.println(); ts.forEach(str-> System.out.print(str+"\t")); System.out.println(); System.out.println("--------------排序習題-----------------"); //建立TestDemo物件 TestDemo tr=new TestDemo("黎唯易",22); TestDemo tr4=new TestDemo("黎新豐",32); TestDemo tr3=new TestDemo("黎易",26); TestDemo tr2=new TestDemo("黎唯易",22); System.out.println(tsStudent.add(tr)); //報異常:ClassCastException System.out.println(tsStudent.add(tr4));//在自定義的資料型別中不知道比較規則 System.out.println(tsStudent.add(tr3)); //解決方法1:用javabean類實現Comparable介面,重新comparaTo()方法 System.out.println(tsStudent.add(tr2)); //遍歷資料 for (TestDemo testDemo : tsStudent) { System.out.println(testDemo); } } }
TestDemo:
package com.Lucky; import java.util.Objects; public class TestDemo implements Comparable<TestDemo>{ private String name; private int age; public TestDemo() { } public TestDemo(String name, int age) { this.name = name; this.age = 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 boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; TestDemo testDemo = (TestDemo) o; return age == testDemo.age && Objects.equals(name, testDemo.name); } //在這重寫hashCode方法, @Override public int hashCode() { return Objects.hash(name, age); } @Override public String toString() { return "TestDemo{" + "name='" + name + '\'' + ", age=" + age + '}'; } // 重新compareTo按照年齡排序 /* this:要新增的資料 o :已經在紅黑樹存在的資料 return: 負數:在紅黑樹的左邊 正數:在紅黑樹的右邊 0:已經在紅黑樹存在,捨棄 */ @Override public int compareTo(TestDemo o) { return this.getAge()-o.getAge(); } }
練習:
package com.Lucky; import java.util.Comparator; import java.util.TreeSet; /* 要求 :建立五個Student物件 ,有屬性:姓名/年齡/語文/數學/英語 先按照總分從高到低排序 總分一樣,就按照語文成績排序 如果語文成績也一樣,就按照數學成績排序 如果數學成績也一樣,就按照英語成績排序 如果英語成績也一樣,就按照年齡排序 如果年齡也一樣,就按照字母排序 */ public class TreeSetDemoThree { public static void main(String[] args) { //建立集合 //自定義比較器物件【如果自然排序和比較器同時存在,採用自定義比較器方法】 TreeSet<Student> tree=new TreeSet<>(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { int i=o1.getVerbal()+o1.getMath()+o1.getEnglish(); int t=o2.getVerbal()+o2.getMath()+o2.getEnglish(); int val=i-t; //比較語文成績 val= val==0 ?o1.getVerbal()-o2.getVerbal():val; //比較數學成績 val= val==0 ? o1.getMath()-o2.getMath():val; //比較英語成績 val= val==0 ? o1.getEnglish()-o2.getEnglish():val; //比較年齡 val= val==0 ? o1.getAge()-o2.getAge():val; //比較字母排序 val= val==0 ? o1.getName().compareTo(o2.getName()):val; return val; } }); //建立Student物件 Student stud1=new Student("唯易",22,98,95,85); Student stud2=new Student("新風",21,80,65,85); Student stud3=new Student("張三",23,70,88,77); Student stud4=new Student("李四",27,98,60,66); Student stud5=new Student("王五",23,98,95,85); //往集合新增資料 tree.add(stud1); tree.add(stud2); tree.add(stud3); tree.add(stud4); tree.add(stud5); for (Student student : tree) { int sum= student.getMath()+student.getEnglish()+student.getVerbal(); System.out.println(student+"總分是:"+sum); } } }