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

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上課練習:Object類別與集合_ArrayList 與 HashSet 集合

ArrayList 與 HashSet 集合

新增一個 HashSetTest 主程式

宣告參考變數使用介面,方便將來更換不同的集合,讓程式將來修改時更容易;
例如,LinkedList 也實作了 List 介面

 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.*; //java.unti套件裡所有的類別


public class HashSetTest {

    public static void main(String[] args) {
        
        Animal a=new Dog();
        a.setName("小白");
        
        Animal b=new Cat();
        b.setName("小花");
        
        Animal c=new Bird();
        c.setName("小飛");
        
        Animal d=new Dog();
        d.setName("小白");
        
        //List介面,有順序姓,可重複
        List<Animal> list=new ArrayList<>(); //隨時可以將ArrayList更換為其他實作介面,只要是List有的
        /*
        宣告 參考變數(list) 使用 介面(List)而不是使用ArrayList,方便將來更換不同的集合,讓程式將來修改時更容易
        List介面可實作的類別很多,ArrayList是其中一個,之後如果修改,可以將ArrayList修改為LinkedList
        下面的程式碼都不需要異動
        List<Animal>指泛型,只要是Animal類別的都可以加入
        */
        list.add(a);
        list.add(b);
        list.add(c);
        list.add(d);
        
        //Set介面,無順序姓,不重複
        Set set=new HashSet(); //同List說明
        set.add(a);
        set.add(b);
        set.add(c);
        set.add(d);
        /*
        若Animal沒有覆寫equals,set集合會出現兩個Dog小白
        因為 Object 的 equals() 使用 == 判斷相等,只有是同一個物件的情況下才會相等
        所以當沒有覆寫equals時,是兩個不同的Dog小白
        */
        
        System.out.println(list);
        System.out.println(set);
        //若要出現的訊息不是顯示雜訊碼,需要再Animal加入toString

    }

}

修改 Animal 的 toString(),使其文字顯示為 物件類別.物件名稱=指定的名字
    @Override
    public String toString() {
        return this.getClass().getName() + "{name=" + name + '}';
        //顯示 物件類別.物件名稱=指定的名字
    }

顯示結果如下


如果 Animal 沒有覆寫 equals(),Set 集合會出現兩個 Dog小白
因為 Object 的 equals() 使用 == 判斷相等,只有同一個物件的情況下才會相等 ( 現在是兩個不同的小白物件 )


************************************************************************************
HashSet使用雜湊碼可以提高搜尋效率

************************************************************************************
Set 的應用
增加一個水果字串,並且使用HashSet(),將水果字串放入
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import java.util.*;

//Set的應用
public class HashSeDemo {

    public static void main(String[] args) {
        String[] fruit = {"蘋果", "香蕉", "鳳梨", "芭樂", "蘋果", "香蕉"};//建立一組水果字串
        Set set = new HashSet();//建立物件
        for (String s : fruit) { //將水果字串一個一個放入迴圈中判斷
            set.add(s); //將水果放入set中,刪除重複
        }
        System.out.println("一共有"+set.size()+"種水果");
        System.out.println(set);//列出水果
    }

}
顯示結果


code
Animal
HashSetTest
HashSetDemo

2015年7月8日 星期三

Java上課練習:樂透

練習08_封裝 繼承 靜態成員
練習09_靜態成員 亂數 樂透 ArrayList


 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
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.ArrayList;


public class Lotto {
    
    private static ArrayList 數字陣列;
    private static ArrayList 樂透;
    private static int 索引;
    private static int 抽出號碼;
    
    public static ArrayList 產生一組樂透號碼(){
        建立數字與樂透陣列();
        將42個號碼放進數字陣列();
        for (int j=1;j<=6;j++){
            用亂數產生一個陣列索引();
            根據索引從陣列取出號碼();
            將抽出的號碼放進樂透陣列();
        }return 樂透;
    }
    
    
    private static void 建立數字與樂透陣列(){
          數字陣列=new ArrayList();
          樂透=new ArrayList();
    }
    
    private static void 將42個號碼放進數字陣列(){
        for (int i=1;i<=42;i++){
            數字陣列.add(i);
        }
    }
    
    private static void 用亂數產生一個陣列索引(){
        索引=(int)(Math.random()*數字陣列.size());
    }
    
    private static void 根據索引從陣列取出號碼(){
        Object obj=數字陣列.remove(索引);
        抽出號碼=(int)obj;
    }
    
    private static void 將抽出的號碼放進樂透陣列(){
        樂透.add(抽出號碼);
    }
    
}


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import java.util.ArrayList;


public class LottoTest {

    public static void main(String[] args) {
        
        ArrayList 樂透號碼=Lotto.產生一組樂透號碼();
        System.out.println(樂透號碼);

    }

}

產生5組樂透號碼

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import java.util.ArrayList;

public class LottoTest2 {

    public static void main(String[] args) {

        ArrayList 五組樂透 = new ArrayList();

        for (int i = 0; i < 5; i++) {
            五組樂透.add(i, Lotto.產生一組樂透號碼());
        }
        for (Object obj:五組樂透){
            System.out.println(obj);
        }
    }

}