顯示具有 集合 標籤的文章。 顯示所有文章
顯示具有 集合 標籤的文章。 顯示所有文章

2010年9月17日 星期五

JAVA筆記-Collections和Arrays 外包的集合工具類別

Collections和Arrays內建了許多好用方法,
例如,取得最大值、排序、thread-safe等
所有方法皆為已實作好的static方法,可直接使用,不用再新建物件實體
將欲處理的集合直接傳入即可,需先import library

import java.util.Collections;
import java.util.Arrays;

Java筆記-泛型 限定集合內存放的物件型別

集合可收集大量任何物件,使用泛型即可限定集合內存放的物件型別
##ReadMore##
無泛型寫法
Vector v = new Vector();
v.add("data");
for(Object obj:v){
  String data = (String) obj;
  System.out.println(data);
}

泛型寫法,Iterator同樣也支援泛型,但泛型不可放入基本資料型別
Vector v = new Vector(); // 泛型寫法
v.add("data");
for(Object obj:v){
  String data = obj; // 不必轉型
  System.out.println(data);
}

萬用字元,可接任何不泛化或已泛化型別
void showVector (Vector v){} // 仍然是可加或可不加
void showVector (Vector v){} // ?也可用其他無意義代號來取代
void showVector (Vector v){} // Number包含Interger和Float

2010年9月16日 星期四

Java筆記-PriorityQueue 優先權佇列

PriorityQueue會自動依照自然法則來排序,範例: import java.util.*;
public class Ex1 {
  public static void main(String[] args) {
    PriorityQueue<String> pq = new PriorityQueue<String> ();
    pq.offer("c");
    pq.offer("a");
    pq.offer("b");
    String s;
    while((s = pq.poll()) != null) {
       System.out.print(s + ", ");
    }
  }
}

 

##ReadMore##
自定義的PriorityQueue要實作Comparator介面,建構子是用 public PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
其中initialCapacity是初始大小,comparator是要求傳入Comparator物件,範例: public class Ex2 {
  public static void main(String[] args) {
    Comparator<String> c = new Comparator<String>(){
      public int compare(String a, String b){
        return a.compareTo(b) * -1;
      }
    };
    PriorityQueue<String> pq = new PriorityQueue<String> (3, c);
    pq.offer("c");
    pq.offer("a");
    pq.offer("b");
    String s;
    while((s = pq.poll()) != null) {
      System.out.print(s + ", ");
    }
  }
}

Java筆記-Queue介面 佇列

不要使用原始的add()和remove(),在Queue中會丟出exception,
以offer()和poll()來代替

方法 傳回值 說明
offer(E o) boolean 加入物件
peek() E 取得物件,若空傳回null
element() E 取得物件,若空傳回例外
poll() E 取得物件,並移除該物件,若空傳回null
remove() E 取得物件,並移除該物件,若空傳回例外
##ReadMore## 範例: import java.util.*;
public class Ex {
    public static void main(String[] args) {
        Queue q = new LinkedList();
        q.offer("First");
        q.offer("Second");
        q.offer("Third");
        Object o;
        System.out.println(q.toString());
        while((o = q.poll()) != null) {
            String s = (String)o;
            System.out.println(s);
        }
        System.out.println(q.toString());
    }
}

Java筆記-應用for-each取得走訪集合物件

利用for-each走訪集合物件較簡單
import java.util.*;
public class Ex {
  public static void main(String[] args) {
    Vector v = new Vector();
    v.add("apple");
    v.add("banana");
    v.add("cookie");
    for(Object obj:v){
      String data = (String)obj;
      System.out.print(data + ", ");
    }
    System.out.println();
  }
}
##ShowAll##

Java筆記-List, Set, Map 集合物件

List => 有順序性
ArrayList => 插入、刪除速度慢,走訪速度快
LinkedList => 插入、刪除速度快,走訪速度慢,採雙向鏈結

Set => 元素不可重複,搜尋快
HashSet => 無順序性,查找速度快
LinkedHashSet => 有順序性
TreeSet => 有排序性(依字母),由紅黑樹所建

Map => 有元素鍵值,搜尋快
LinkedHashMap =>  查找速度慢,插入、刪除速度快
TreeMap => 有排序性,由紅黑樹所建
##ReadMore##
原始集合 => 不同的是皆被宣告為具有Synchronized特性
Vector => ArrayList的前身,當超出範圍時,vector是擴充元有的一倍,ArrayList則是擴充一半
Stack => 採FILO原則,繼承Vector,但應使用LinkedList來代替
Hashtable => 不予許為null,所以比HashMap稍慢
HashMap => 查找速度快,鍵、值予許為null

集合介面
排序性
順序性
不予許重複
使用鍵值
SortedSet

SortedMap


HashMap
Hashtable
TreeMap
LinkedHashMap
HashSet
TreeSet

LinkedHashSet
ArrayList
Vector
LinkedList
java.util.Collection
      <- java.util.List
            <- java.util.ArrayList 
            <- java.util.LinkedList 
            <- java.util.Vector 
                  <- java.util.Stack
      <-java.util.Set 
            <- java.util.HashSet 
            <- java.util.SortedSet
                  <- java.util.TreeSet
java.util.Map
      <- java.util.SortedMap
            <- java.util.TreeMap
      <- java.util.Hashtable
      <- java.util.HashMap
      <- java.util.LinkedHashMap
      <- java.util.WeakHashMap

Java筆記-Enumeration和Iterator 走訪集合物件

Enumeration
無順序性,不可移除集合元素,適用在Map族群的集合物件中
測試是否有下一個元素 => hashMoreElements()
指向下一個元素 => nextElement()

Iterator
有順序性,可移除集合元素,適用在非Map族群的集合物件中
測試是否有下一個元素 => hashNext()
指向下一個元素 => next()
移除目前Iterator所指向的元素 => remove()
##ReadMore##
Listlterator
繼承Iterator,給予每個元素之間index值,來達成上下走訪元素
測試是否有上一個元素 => hashPrevious()
測試是否有下一個元素 => hashNext()
指向上一個元素 => previous()
指向下一個元素 => next()
指向上一個元素,並回傳該鍵值 => previousIndex()
指向下一個元素,並回傳該鍵值 => nextIndex()
移除目前Iterator所指向的元素 => remove()
取代目前所指向的元素 => set(Object o)

Iterator範例:

import java.util.*;
public class Ex {
    public static void main(String[] args) {
        HashSet hs = new HashSet();
        hs.add("one");
        hs.add("two");
        hs.add("tree");
        hs.add("four");
        Iterator it = hs.iterator();
        while(it.hasNext()){
            String data = (String)it.next();
            System.out.print(data + ", ");
        }
        System.out.println();
    }
}

2009年12月22日 星期二

JAVA筆記-覆寫equals()與hashCode()

之前寫Collection,看到這兩個方法,就很想使用
但要用的近乎人意,卻要很費一番功夫

沒有被覆寫的equals是比較兩物件的參考位置,物件不同則傳回false
若要比對兩物件屬性內容值,則要自己覆寫
並且也一併覆寫hashCode,不同物件會有不同hash code
若兩物件equals()相等,hashCode()也必須相等,否則可能會有錯誤問題
尤其是Hash-Based Collection會用到

/* equals()覆寫例子 */

public boolean equals(Object obj) {

  //若同一物件則true
  if (this == obj) return true;

  //getClass()會可用來判斷物件是否屬於同一類別
  if(obj != null && getClass() == obj.getClass()){
    if(obj instanceof Ball) {
      Ball ball = (Ball)obj;
      //比對屬性內容值
      if (tradeMark.equals(ball.tradeMark) &&
          kind.equals(ball.kind) &&
          color.equals(ball.color)) {
        return true;
      }
    }
  }
  return false;
}


覆寫hashCode()不容易,
使用jakarta所提供的HashCodeBuilder類別,
下載commons-lang-2.1.jar,
看到這裡,懶惰的我,也想放棄了,
真的要用到再說吧!

/* hashCode()覆寫例子 */

import org.apache.commons.lang.builder.HashCodeBuilder;//加入外掛

public int hashCode() {
  return new HashCodeBuilder(17, 37). //應放入兩個質數
    append(tradeMark). //利用append()加入參與的物件變數
    append(kind).
    append(color).
    toHashCode(); //最後取得hash code數值
}
/