13.1 Java.util
(1) 聚集
BitSet:動態可變的位向量。 Enumeration:一個接口,返回的對象枚舉了一個值的集合。 Vector:動態可變的Object向量。 Stack:在Vector中加進后進先出方法后的擴展。 Dictionary:抽象類,完成關鍵字到值的算法。 Hashtable:用哈希碼實現Dictionary Properties:Hashtable擴展,其鍵和值都是String型。 (2) 設計模式
Observer/Observable:這一對接口/類使得一個對象成為Observable,做法是當在一個Observable對 象中發生某感興趣的事件時,一個或多個Observer對象被通知到。 (3) 雜項
Date: 以秒為最小計數單位的時間、日期。 Random:可產生偽隨機數序列的對象。 StringTokenizer:據界限符將字符串分解為Token。 13.2 BitSet
(1) BitSet類
大小可動態改變, 取值為true或false的位集合。用于表示一組布爾標志。 存儲的大小只要保證能索引。超出有效范圍就認為fasle。 (2) 構造函數: BitSet() or BitSet(int nbits)
(3) 方法
public void set(int pos): 位置pos的字位設置為true。 public void clear(int pos): 位置pos的字位設置為false。 public boolean get(int pos): 返回位置是pos的字位值。 public void and(BitSet other): other同該字位集進行與操作,結果作為該字位集的新值。 public void or(BitSet other): other同該字位集進行或操作,結果作為該字位集的新值。 public void xor(BitSet other): other同該字位集進行異或操作,結果作為該字位集的新值。 public int size(): 在不增加集合容量前提下,返回可被設置或清除的最高的字位序號。 public int hashCode(): 返回該集合Hash 碼, 這個碼同集合中的字位值有關。 public boolean equals(Object other): 如果other中的字位同集合中的字位相同,返回true。 (4) 例1:標明一個字符串中用了哪些字符
public class WhichChars{
private BitSet used = new BitSet();
public WhichChars(String str){
for(int i=0;i<str.lenth();i++)
used.set(str.charAt(i));// set bit for char
}
public String toString(){
String desc="[";
int size=used.size();
for(int i=0;i<size;i++){
if(used.get(i))
desc+=(char)i;
}
return desc+"]";
}
};
例2:篩選法求素數 BitSet sieve=new BitSet(1024);
int size=sieve.size();
for (int i=0;i<size;i++) sieve.set(i);
int finalBit = (int)Math.sqrt(sieve.size());
for (int i=2; i<finalBit;i++)
if (sieve.get(i))
for (int j=2*i;j<size;j+=i)
sieve.clear(j);
13.3 Enumeration接口/ StringTokenizer
13.3.1 Enumeration
(1) 方法
public abstract boolean hasMoreElements():不空返回true, public abstratObject nextElement(): 返回下一個元素。若枚舉已空,則引發NoSuchElementException。 (2) 例子
import java.util.Enumeration;
class Enum implements Enumeration {
private int count = 0;
private boolean more = true;
public boolean hasMoreElements() {
return more;
}
public Object nextElement() {
count++;
if(count >4 ) more = false;
return new Integer(count);
}
}
Enumeration enum = new Enum();
while (enum.hasMoreElements())
System.out.println(enum.nexElement());
13.4.2 StringTokenizer
(1) Constructors
public StringTokenizer(String str,String delim,boolean returnTokens) 對字符串str構作一個StringTokenizer, delim中字符作界限符。returnTokens是將界限符作為標記返回還是跳過,若作為標記返回,則每個界限符單獨返回。
public StringTokenizer(String str,String delim) 等效與StringTokenizer(str,delim,false),即界限符不返回。
public StringTokenizer(String str) 等效于StringTokenizer(str," \t\n\r"),即空格符作為界限符。
(2) Methods
public boolean hasMoreTokens(): 若還有標記,返回true。 public String nextToken() 返回串中下個標記。若無,則引發NoSuchElementException.
public String nextToken(String delim) 將界限符集改為delim中字符并返回下個標記。注意沒有只設新的界限集而不返回下一個標記的方法。
public int countTokens() 以當前界限集進行分解時字符串中還剩下的標記數。
(3) 例1: 用空格和逗號來分隔字符串:
String str = "Gone,and forgotten";
StringTokenizer tokens = new StringTokenizer(str," ,");
while(token.hasMoreTokens())
System.out.println(token.nextToken());
(4) 例2: 分析name=value
import java.util.StringTokenizer;
class STDemo {
static String in = *title=java: author=Xu:*+
*email=xudx@nju*;
public static void main(String args[]){
StringTokenizer st= new StringTokenizer(in,*= :*);
while (st.hasMoreTokens()) {
String key = st.nextToken();
String value = st.nextToken();
System.out.println(key+*\t*+value);
}
}
}
若要功能更強的機制來分解字符串, 可用StreamTokenizer。先用字符串創建一個StringBufferInputStream對象。
Vector and Stack 13.4.1 Vector: 大小可變的Object數組,存取, 加入或刪除,
(1) 構造函數
public Vector(int initialCapacity,int capacityIncrement) 創建一個空向量(初始容量, 容量增量)
public Vector(int initialCapacity): Vector(initialCapacity,0) public Vector(): 以缺省初始容量建立空向量,容量增量為0。 (2) 域
protected Object elementData[]: 存儲元素的緩沖區。 protected int elementCount: 當前緩沖區中的元素個數。 protected int capacityIncrement:當elementData用完時增加的元素個數,為0則每次容量增倍。 (3) 修改
public final synchronized void setElementAt(Object obj, int index): 將obj放在index處。 public final synchronized void removeElementAt(int index) 將index處的元素刪去,index后元素前移,大小減1。
public final synchronized void insertElementAt(Object obj, int index) : 將obj插在index處,向量中index后元素后移。 public final synchronized void addElement(Object obj) 將obj放在向量的尾上。
public final synchronized boolean removeElement(Object obj) 先找Obj, 調用removeElementAt,or 返回false。
public final synchronized void removeAllElements() 刪除向量中所有元素,即變為空。
Example import java.util.Vector;
public class Polygon{ // 存儲多邊形頂點的Point表
private Vector verties = new Vector();
public void add(Point p){
verties.addElement(p);
}
public void remove(Point p){
verties.removeElement(p);
}
public int numVerties(){
return verties.size();
}
// ..其它方法....
}
(4) 檢測
查找方法都用到Object.equals. 若index 無效,異常。 public finalsynchronized Object elementAt(int index) public final boolean contains(Object obj): 在向量中返回true。 public final synchronized int indexOf(Object obj ,int index) 從index開始,返回obj第一次出現的序號。若不存在返回-1。
public finalint indexOf(Object obj): =indexOf(obj,0)。 public final synchronized int lastIndexOf(Object obj ,int index) 反向搜索,返回obj第一次出現序號。若不存在,返回-1。
public final int lastIndexOf(Object obj): =lastIndexOf(obj , 0)。 public final synchronized void copyInfo(Object[] anArray) 將向量中的元素拷貝到指定的數組中
public final synchronized Enumeration element() 返回當前元素表的Enumeration。
public final synchronized Object firstElement() 返回向量的第一個元素,若向量為空,引發異常。
public final synchronized Object lastElement() 返回最后一個元素,若向量為空,引發異常。firstElement和lastElement這對方法能用來循環遍歷向量中的元素。
(5) 容量管理
public final int size(): 返回當前向量中元素個數。 public final boolean isEmpty(): 向量為空返回true。 public final synchronized void trimToSize() 將向量的容量置為當前它含有的元素個數, 在元素個數穩定不變時可用它來減少向量的存儲空間。以后需要時仍可增加。
public final synchronized void setSize(int newSize) 將向量的大小置為newSize,若為減少,則尾上超過的部分被丟棄,若增加則新元素置null。
public final int capacity() 返回當前容量。即不增加新元素時, 能容納的元素個數。
pub final synchronized void ensureCapacity(int minCapacity): 在需增加容量時,保證至少minCapacity。 (6) 例子:使Polygon能包含另一個多邊形的頂點的方法
public void merge(Polygon other){
int otherSize = other.vertices.size();
vertices.ensureCapacity(vertices.size()+otherSize);
for(int i=0;i<otherSize;i++)
vertices.addElement(other.vertices.elementAt(i));
}
|