常見的數據結構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。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章