1. 程式人生 > >常見的資料結構java實現

常見的資料結構java實現

1.常見資料結構的Java實現 
(1)連結串列的基本操作  掌握該方法即可
(2)棧
(3)樹集
(4)樹對映
(5)散列表
(6)雜湊集


2.連結串列的建立
使用java.util包中的LinkedList類,可以建立一個連結串列物件。例如:
LinkedList mylist=new LinkedList();  //建立了一個空雙鏈表
也可以使用add()方法向連結串列依次增加節點。例如增加節點:
mylist.add(“It”);
mylist.add(“is”);
mylist.add(“a”);
mylist.add(“door”);
這樣就形成了4個節點的連結串列,資料依次為“It”、“is”、“a”、“door”,4個節點是自動連結的。 


3.LinkedList類中的常用方法


public boolean add(Object element) //向連結串列末尾新增一個新的節點,該節點中的資料是引數element指定的物件。
public void add(int index, Object element ) //向連結串列指定位置新增節點,該節點中的資料是引數element指定的物件。
public void addFirst(Object element) //向連結串列頭新增新節點,該節點中的資料是引數element指定的物件。
public void addLast(Object element) //向連結串列尾新增新節點,該節點中的資料是引數element指定的物件。
public Object removeFirst() //刪除第一個節點,並返回這個節點中的物件。
public Object removeLast() //刪除最後一個節點,並返回這個節點中的物件。
public Object remove (int index) //刪除指定位置的節點
public Object get (int index) //得到指定位置的節點
public Object getFirst() //得到連結串列第一個節點的物件。
public Object getLast() //得到連結串列最後一個節點的物件。
int indexOf(Object element):返回節點物件element在連結串列中首次出現的位置,如果連結串列中無此節點物件則返回-1。
public int lastIndexOf(Object element):返回節點物件element在連結串列中最後出現的位置,如果連結串列中無此節點物件則返回-1。
public Object set(int index,Object element) //將當前連結串列index位置節點中的物件替換成引數element指定的物件,返回被替換物件。
public int size( ) //返回量表的長度,即節點的個數。
public boolean contains(Object element):判斷連結串列節點物件中是否含有element。


4.使用Iterator類遍歷連結串列


迭代器(Iterator),又叫做遊標(Cursor)。
提供一種方法訪問一個容器(container)物件中各個元素,而又不需暴露該物件的內部細節。 


Boolean  hasNext():如果仍有元素可以迭代,則返回 true。
Object next():返回迭代的下一個元素。
void remove():從迭代器指向的集合中移除迭代器返回的最後一個元素。
一個連結串列物件可以使用iterator()方法獲取Iterator變數, Iterator物件中每個資料成員剛好是連結串列節點中的資料,而且這些資料成員是按順序存放在Iterator物件中的, Iterator物件使用next()方法可以得到其中的資料成員。




5.棧
棧(Stack)也是一種特殊的線性表,是限定僅在表尾進行插入和刪除運算的線性表,是一種後進先出(LIFO)的資料結構。
只能在一端進行輸入或輸出資料的操作,堆疊把第一個放入該堆疊的資料放在最底下,而把後續放入的資料放在已有資料的頂上,表尾稱為棧頂(top),表頭稱為棧底(bottom)。
棧的物理儲存可以用順序儲存結構,也可以用鏈式儲存結構。向堆疊中輸入資料的操作稱為“壓棧”,從棧中輸出資料的操作稱為“彈棧”。


6.棧的常用方法
使用java.util包中的Stack類建立一個堆疊物件,堆疊物件可以使用以下方法:
public Object push(Object data) //輸入資料,實現壓棧操作
public Object pop() //輸出資料,實現彈棧操作
public boolean empty() //測試堆疊是否為空。如果空,返回true,否則返回false
public object peek() //檢視堆疊頂端的資料,但不刪除該資料。
public int search(Object data) //返回物件在棧中的位置,最頂端的位置是1,向下依次增加,如果堆疊不含此資料,則返回-1。




7.用連結串列實現棧
可以採用連結串列的方法來實現棧。
用方法addFirst(Object element)實現進棧操作。
用方法removeFirst()實現出棧。
用方法getFirst()實現棧頂資料查詢。
用方法isEmpty() 實現棧是否為空。


8.樹集
TreeSet類是實現Set介面的類。
樹集是由一些節點物件組成的資料結構,節點按著樹形一層一層的排列。
樹集是個有序集合,可以按照任何順序將元素插入該集合,該元素將被納入它的相應的排序位置;當迭代通過該集合時,各個值將自動按照排序後的順序出現;將元素新增給樹集的速度要比將它新增給散列表慢,但是仍然比新增到陣列或連結式列表中的正確位置快。


9.用構造方法TreeSet()建立一個樹集
可以使用java.util包中的TreeSet來建立一個樹集,如
TreeSet mytree=new TreeSet();
mytree.add("boy");       //然後使用add方法為樹集新增節點:
mytree.add("zoo");
mytree.add("apple");
mytree.add("girl");


10.用構造方法TreeSet(Comparator c)建立一個樹集
很多物件不適合用字典序進行比較,在建立樹集時可自己規定節點按著什麼樣的“大小”順序排列。
假如我們有四個學生物件,他們有姓名和成績,我們想把這四個物件做為一個樹集的節點,並按著成績的高低排列節點,而不是按著姓名的字典序排列節點。


11.(1)首先建立學生的NewStudent類必須實現介面:Comparable。
Comparable介面中有一個方法:
public int compareTo(Object b); 
所有可以排序的類都必須實現Comparable介面。
NewStudent類通過實現這個介面來規定它建立的物件的大小關係,如下所示。
Java規定:
a.compareTo(b)=0時,稱二者相等;
s1.compare(s2)>0時,稱a大於b;
s1.compare(s2)<0時,稱a小於b。




12.TreeSet類的一些常用方法
TreeSet類的一些常用方法如下:
public boolean add(Object o):向樹集新增加節點,新增成功返回true,否則返回false。
public void clear():刪除所有的節點。
public void contains(Object o):如果包含節點o返回true 。
public Object first():返回根節點,即第一個節點(最小的節點)。
public Object last():返回最後一個節點(最大的節點)。
public isEmpty():判斷是否是空樹集,如果樹集不含節點返回true 。
public boolean remove(Object o):刪除節點o。
public int size():返回節點數目。


13.樹對映
上一節學習的樹集TreeSet適合用於資料的排序,結點是按著儲存的物件的大小升序排列。TreeMap類實現了Map介面,稱TreeMap物件為樹對映。樹對映使用:
public V put(K key,V value); 
方法新增結點,該結點不僅儲存資料value,而且也儲存和其關聯的關鍵字key,也就是說,樹對映的結點儲存“關鍵字/值”對。和樹集不同的是,樹對映保證結點是按照結點中的關鍵字升序排列。TreeMap類的常用構造方法如下:
TreeMap():構造一個新的空對映,該對映按照鍵的自然順序排序。
TreeMap(Comparator<? super K> c):構造一個新的空對映,該對映根據給定的比較器進行排序。


14.散列表Hashtable
散列表是使用相關關鍵字查詢被儲存的資料項的一種資料結構,關鍵字必須唯一,任何非 null 物件都可以用作鍵或值。
散列表在它需要更多的儲存空間時會自動增大容量。例如,如果散列表的裝載因子是0.75,那麼當散列表的容量被使用了75%時,它就把容量增加到原始容量的2倍。
為了成功地在雜湊表中儲存和檢索物件,用作鍵的物件必須實現 hashCode 方法和 equals 方法


15.散列表是使用相關關鍵字查詢被儲存的資料項的一種資料結構,關鍵字必須唯一,任何非 null 物件都可以用作鍵或值。
散列表在它需要更多的儲存空間時會自動增大容量。例如,如果散列表的裝載因子是0.75,那麼當散列表的容量被使用了75%時,它就把容量增加到原始容量的2倍。


為了成功地在雜湊表中儲存和檢索物件,用作鍵的物件必須實現 hashCode 方法和 equals 方法


16.Hashtable類的常用方法
Hashtable類的常用方法如下:
public Hashtable():建立具有預設容量和裝載因子為0.75的散列表。
public Hashtable(int itialCapacity):建立具有指定容量和裝載因子為0.75的散列表。
public Hashtable(int initialCapacity,float loadFactor):建立具有預設容量和指定裝載因子散列表。
public void clear():清空散列表。
public boolean contains(Object o):判斷散列表是否有含有元素o。
public Object get(Object key):獲取散列表中具有關鍵字key的資料項。
public boolean isEmpty():判斷散列表是否為空。
public Object put(Object key,Object value):向散列表新增資料項value並把關鍵字key關聯到資料項value。
public Object remove(Object key):刪除關鍵字是key的資料項。
public int size():獲取散列表中關鍵字的數目。
elements()方法返回一個Enumeration物件,實現遍歷散列表.




17.雜湊集
散列表是個連結式列表的陣列,每個列表稱為一個散列表元,散列表為每個物件計算出一個整數,稱為雜湊碼,不存在重複的多個元素;若要查詢表中的某個物件的位置,只要計算出它的雜湊碼,再將它減去以散列表元的總數為模數的值,得出的數就是擁有該元素的散列表元的索引。如果大致知道散列表最終會擁有多少個元素,那麼應該將初始散列表元的數量設定為大約是預期元素數量的150%,最好是將散列表的大小設定成一個素數。在Java中,使用載入因子決定何時要對散列表進行再雜湊。
Java的集合庫提供了一個HashSet類,用於根據散列表來實現一個雜湊集;建構函式如下:
HashSet(int initialCapacity); 
HashSet(int initialCapacity,float loadFactor); 


只有在不在乎集合中的各個元素的順序時,才能使用雜湊集。
Java增加了一個類LinkedHashSet,用於跟蹤新增給雜湊集的元素順序;其迭代器會按照元素的插入順序來訪問各個元素。








18.HashSet和TreeSet的比較:
HashSet是基於Hash演算法實現的,其效能通常都優於TreeSet。我們通常都應該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。