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

取值方法

  1. iterator取值
  2. for迴圈+ get 或 elementAt(i)
  3. Enumeration
  4. 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的幾個優缺點

缺點:

  1. ArrayList沒有中括號的operator, 所以只能用get的方式來取得element
  2. Base type只能是Class Object, 不能是primitive type
  3. 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();
 }

Reference

java stl and C++ stl