顯示具有 TreeSet 標籤的文章。 顯示所有文章
顯示具有 TreeSet 標籤的文章。 顯示所有文章

2015年8月5日 星期三

Java上課練習:集合

集合可以裝集合

類別圖


程式碼如下
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.TreeSet;

//集合可以裝集合(addall)
public class CollectionDemo {

    public static void main(String[] args) {

        //參考類別圖
        ArrayList list = new ArrayList(); //類別 ArraryList 已實作的介面有list、Collection
        list.add(1);
        list.add(2);
        list.add(3);

        HashSet set = new HashSet();//類別 HashSet 已實作的介面有Set、Collection
        set.add(100);
        set.add(90);

        LinkedList list2 = new LinkedList();//類別 LinkedList 已實作的介面有list、Collection
        /*
         LinkedList也是一種Collection,所以可以把另一個Collection(ArraryList or HashSet)直接加入
         */
        list2.addAll(list);//將Collection(list)加入
        list2.addAll(set);
        list2.add(80);
        list2.add(60);
        System.out.println(list2);

        //排序,不可以把不同種類的類別放入,因為要compareTo,會無法比大小
        TreeSet set2 = new TreeSet(list2);//類別 TreeSet 已實作的介面有Set、Collection
        /*
         建構子直接可以裝Collection,不用使用addAll
         */
        System.out.println(set2);

    }

}

集合也可以放物件,但是是參考物件,非複製
import java.util.ArrayList;

//集合裡放的是物件參考
public class CollectionDemo2 {

    public static void main(String[] args) {
        Animal dog=new Dog(); //dog是一個遙控器
        dog.setName("小白");
        
        ArrayList list= new ArrayList(); //ArrayList裡面也有一支list遙控器
        list.add(dog); //實際上是複製參考(共用),並非複製物件
        /*
        把dog這支遙控器複製到List中,所以當dog遙控器改名字,list這支遙控器的名字也會改變
        */
        System.out.println(list);
        
        dog.setName("阿花");//所以dog名字改為阿花,list的dog名字也會變成阿花
        System.out.println(list);
                

    }

}

2015年7月31日 星期五

Java作業練習01:學生成績排名

完成 Student 類別,依總分由大排到小,總分相同比英文,英文相同比數學,數學相同比名字,名字相同則亂數決定

Student 類別
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Student implements Comparable<Student> {

    String name;
    int eng;
    int math;
    int sum;

    public Student(String name, int eng, int math) {
        this.name = name;
        this.eng = eng;
        this.math = math;
        this.sum = eng + math;
    }

    @Override
    public String toString() {
        return name + " " + eng + " " + math + " " + sum;
    }

    @Override
    public int compareTo(Student o) {
        if (this.sum > o.sum) {
            return -1;
        } else if (this.sum == o.sum && this.eng > o.eng) {
            return -1;
        } else if (this.eng == o.eng && this.math > o.math) {
            return -1;
        } else if (this.math == o.math && this.name.compareTo(o.name)<0) { //名字字串比對
            return -1;
        } else if (this.name.compareTo(o.name)== 0){
            return (int) Math.random()*10;
        }return 1;
    }
}

StudentTest 主程式
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
public class StudentTest {

    public static void main(String[] args) {
       Set<Student> set =new TreeSet<>();
       set.add(new Student("Tom", 100, 90)); //190
       set.add(new Student("Amy", 95, 100)); //195
       set.add(new Student("Joe", 95, 95)); //190
       set.add(new Student("Lee", 100, 90)); //190
       
       //依總分由大排到小,總分相同比英文,英文相同比數學,數學相同比名字,名字相同則亂數決定 
       System.out.println("成績排行");
       int rank=0;
       for(Student stu:set){
           rank++;
           System.out.println(rank+". "+stu.toString());
       }

    }

}

顯示結果


code
Student
StudentTest

Java上課練習:Object類別與集合_自動排序物件的集合

TreeSet:自動排序物件的集合

新增一個 TreeSetTest 主程式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.*;

public class TreeSetTest {

    public static void main(String[] args) {
        //Set介面,不重複
        //TreeSet,不重複,有排序性
        Set<Integer> set = new TreeSet<>();//隨時可以將TreeSet更換為其他實作介面,只要是Set有的
        /*
         宣告 參考變數(set) 使用 介面(Set)而不是使用TreeSet,方便將來更換不同的集合,讓程式將來修改時更容易
         Set介面可實作的類別很多,TreeSet是其中一個,之後如果修改,可以將TreeSet修改為HashSet
         下面的程式碼都不需要異動
         Set<Integer>指泛型,只要是Integer的類型都可以加入
         */
        set.add(10);
        set.add(5);
        set.add(7);
        set.add(3);

        Set<String> set2 = new TreeSet<>();
        set2.add("C");
        set2.add("A");
        set2.add("F");
        set2.add("B");

        System.out.println(set);
        System.out.println(set2);
    }

}

顯示結果


若將 Animal物件放入TreeSet
//嘗試將 Animal 物件放入 TreeSet
        Animal a = new Dog();
        a.setName("小白");

        Animal b = new Cat();
        b.setName("小花");

        Animal c = new Bird();
        c.setName("小飛");

        Set<Animal> set3 = new TreeSet<>();
        set3.add(a);
        set3.add(b);
        set3.add(c);

若要將動物也使用TreeSet會出現錯誤,因為動物無法排序,
將 a 加入 TreeSet ,轉型失敗, a 所操作的 Dog 物件
無法轉成 java.lang.Comparable 型別
所以會出現下面的結果


TreeSet 只接受具有 Comparable 特性的物件
所以要在 Animal 插入介面 Comparable<Animal>,並且加入自定的規則
abstract public class Animal implements 有攻擊能力的, Comparable<Animal> { // 抽象類別

    @Override //定義Animal的大小判定,以下以字串名字長度為判斷標準
    public int compareTo(Animal o) {
        return this.name.length()-o.name.length(); 
        /*
        可將下面判斷方式簡化,若要由大排到小,將運算結果前面加上負號即可
        return -(this.name.length()-o.name.length());
        */
        
//        if (this.name.length() > o.name.length()) {
//            return 0;
//        } else if (this.name.length() > o.name.length()) {
//            return -1;
//        } else {
//            return 0;
//        }
        /*
        返回:負整數、零或正整數,根據此物件是小於、等於還是大於指定物件。
        */
    }

}

再次執行TreeSet
        //嘗試將 Animal 物件放入 TreeSet
        Animal a = new Dog();
        a.setName("小白A");

        Animal b = new Cat();
        b.setName("小花");

        Animal c = new Bird();
        c.setName("小飛");
        
        //判斷大小compareTo
//        System.out.println("");
//        int result = a.compareTo(b);
//        System.out.println("a.compareTo(b) = " + result);
//        result=b.compareTo(c);
//        System.out.println("b.compareTo(c) = "+result);

        Set<Animal> set3 = new TreeSet<>();
        set3.add(a);
        set3.add(b);
        set3.add(c);
        System.out.println(set3);
        /*
         若要將動物也使用TreeSet會出現錯誤,因為動物無法排序
         Dog cannot be cast to java.lang.Comparable
         將 a 加入 TreeSet ,轉型失敗, a 所操作的 Dog 物件 無法轉成 java.lang.Comparable 型別
         TreeSet 只接受具有 Comparable 特性的物件
         所以要在Animal插入介面Comparable<Animal>,並且加入自定的規則
         */
        /*
        當加入Comparable<Animal>後,WHY小飛還是沒有出現
        因為 b.compareTo(c) 的結果為 0,表示 b 與 c 相等,TreeSet 不重複的特性,所以 c(小飛) 不會放進 TreeSet 裡
        ( TreeSet 使用 compareTo() 判斷相等性 ,HashSet 使用 equals() 判斷相等性)
        */

顯示結果


為什麼 小飛 不在 TreeSet 裡 ?
因為 b.compareTo(c) 的結果為 0,表示 b 與 c 相等,TreeSet 不重複的特性,所以 c(小飛) 不會放進 TreeSet 裡
( TreeSet 使用 compareTo() 判斷相等性 ,HashSet 使用 equals() 判斷相等性)

最後整個 Animal 的關聯


code
Animal
TreeSetTest