Java STL
17 April 2020
Java STL
Strings
Immutable object, 不能夠被修改值
String s1 = new String("hello");
String[5] s1 = {"hello","world"...};
char charAt(int idx): 相當於s[idx] (但這個才是正確寫法)
int indexOf(char ch): 回傳ch在String的位置
char[] toCharArray(): String to char array
String substring(int begin, [int end]): s[begin:end]
length: 字串長度
equals: 判斷兩字串是否相同
toLowerCase / toUpperCase
String[] split: s1.split('\n')
StringBuilder
因為String本身是immutable的物件, 所以用”+”執行append工作時,其實他是會把A+B這個operation產生一個新的String物件內容是(A+B), 執行多次會產生多個而不是指向同個, 所以空間時間運用會很沒效率(每個”+”運算都要create一個新的String Object), 所以用StringBuilder避免這個麻煩
StringBuilder builder = new StringBuilder("");
for(int i = 0; i < 10000; i++)
builder.append(String.valueOf(i));
System.out.print(builder.toString());
System.out.print(builder.length());
Vector
可以放入任意data type的動態陣列 (沒有規定依定要都是int之類的) Vector implement iterable, collecction, List, Serializable, RandomAccess這些interface
取值方法
- iterator取值
- for迴圈+ get 或 elementAt(i)
- Enumeration
- toArray
注意很多回傳的都是Object, 所以是可以直接印出值,但也可以做casting一下
vector([int size]): 產生一個可以放size個element的vector, 預設為10
新增
addElement(Object obj): 相當於push_back 較好的寫法為v.addElement(new Integer(1));
setElement(Object obj, int idx): 把idx的物品改成obj
移除
removeElement(Object obj): 找到第一個是obj的元素然後移除
removeElementAt(int idx): 移除v[idx]
removeAllElement()
搜尋
int indexOf(Object obj,[int idx]): 從idx往後找到第一個符合obj的元素, 沒有就return -1
lastindexOf(Object obj): 找到最後一個符合的obj
Object firstElement(), lastElement(): 回傳第一,最後一個object
遍歷
Enumeration vEnum = v.elements();
while(vEnum.hasMoreElements())
System.out.print(vEnum.nextElement() + " ");
Reference: javadoc
Dictionary (Obsolete)
put(Object key,Object value);
Object get(Object key);
Enumeration keys();
Enumberation elements();
int size();
while(vEnum.hasMoreElements())
System.out.print(vEnum.nextElement() + " ");
ArrayList
可以動態修改的array, 這就真的比較像vector, array裡面都要放固定的data type
在java.util內
ArrayList<String> s = new ArrayList<String>();
add(Object obj);
set(int idx, Object obj);
remove(int idx);
size();
get(idx); 相當於ArrayList[idx]的acess方式, 只是ArrayList沒有中括號access模式
trimToSize(); 不吃任何parameter, 把空間釋放到剩下size()大小的量
clone(); Deep Copy, 回傳一個新的ArrayList, 如果單純用 "=" 的話是shallow copy,一邊修改另一邊的值也會變,指到相同東西
ArrayList<String> s = new ArrayList<String>();
s.add("Google");...
for(String i:sites){
System.out.println(i);
}
sorting
import java.util.Collections;
Collections.sort(arraylist)
ArrayList的幾個優缺點
缺點:
- ArrayList沒有中括號的operator, 所以只能用get的方式來取得element
- Base type只能是Class Object, 不能是primitive type
- Less efficient, 因為他跟vector一樣
LinkedList
LinkedList<E> list = new LinkedList<E>();
list.addFirst(), addLast, removeFirst, removeLast
List.getFirst(), getLast(), get(idx)
List.poll(), pollFirst, pollLast 看第一個element並移除
List.peek()
List.toArray()
List.set(idx,E) -> 相當於List[idx] = E
List.indexOf(o) -> index of first occurence of object o
List.contains(o)
List.clear(), List.clone() -> shallow copy
Iterate
for (String i : list) {
System.out.println(i);
}
Priority Queue
- 在java.util裡面
PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
$ pq.add()
$ pq.remove(data): 把pq裡第一個遇到值為data的移除
$ pq.remove(): 把第一個元素移除
$ pq.contains(Object o): 檢查priority queue裡有沒有o這個Object
$ pq.peek(): 取得目前priority queue的root元素, return null if empty
$ pq.poll(): return root元素並移除他, return null if empty
$ pq.toArray(): 把pq變成Array回傳
$ pq.isEmpty()
$ pq.size()
$ pq.clear(): 清空
Iterate
Iterator iterator = pq.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
HashSet
- 類似C++的set
HashSet<String> s = new HashSet<String>();
s.add(String)
s.contains(String key) // return true if contains
s.remove(String key) -> return true if success else false
s.clear(), s.empty(), s.size()
iterate
for (String i : s) {
System.out.println(i);
}
HashMap
- java.util
- 類似C++的Map
HashMap<Integer, String> s = new HashMap<Integer, String>();
s.put(int,string): 相當於s[int] = string;
s.remove(int): remove key和他對應的那個value
s.get(int): return key對應的value, 相當於s[int].
s.clear(): 清空
s.empty()
s.size()
s.containsKey(), s.containsValue()
s.replace(key, newvalue)
Iterate
// 输出 key 和 value
for (Integer i : Sites.keySet()) {
System.out.println("key: " + i + " value: " + Sites.get(i));
}
// 返回所有 value 值
for(String value: Sites.values()) {
// 输出每一个value
System.out.print(value + ", ");
}
ArrayDeque (Deque)
- 跟C++ Deque壹樣
- Implement Queue, Deque interface
- 比Queue Stackc還快
ArrayDeque<E> dq = new ArrayDeque<E>();
boolean dq.add(); // 跟addLast壹樣, 差別在他會回傳true/false
void dq.addFirst(E),dq.addLast(E)
dq.clear(), dq.empty(), dq.size()
dq.getFirst(), dq.getLast(): 取得第一/最後的element(不remove)
dq.element(): 跟dq.getLast壹樣,
dq.peekFirst(), dq.peekLast() 跟getFirst,getLast壹樣(沒東西時會回傳Null)
dq.pollFirst(), dq.pollLast() 回傳第一/最後元素並移除(empty回傳null)
dq.removeFirst(), dqlremoveLast() 回傳第一/最後元素並移除
Object[] arr = dq.toArray();
Iterator
定義在java.util.Iterator 基本上上面的java STL都有, 都可以用
ArrayList<String> sites = new ArrayList<String>();
Iterator<String> it = sites.iterator();
while(it.hasNext()){
System.out.print(it.next());
if(it.next() < 10) it.remove();
}