用java實現一個簡單的ArrayList
阿新 • • 發佈:2019-01-03
重複造輪子雖然不可取,但是溫習一下資料結構,光看不做總是少了什麼,所以也來實現一下List,希望多多包涵。
既然要實現一個List,先來簡單說一下List的定義
線性表是最基本、最簡單、也是最常用的一種資料結構。 線性表中資料元素之間的關係是一對一的關係,即除了第一個和最後一個數據元素之外,其它資料元素都是首尾相接的 (注意,這句話只適用大部分線性表,而不是全部。比如,迴圈連結串列邏輯層次上也是一種線性表(儲存層次上屬於鏈式儲存), 但是把最後一個數據元素的尾指標指向了哨位結點)。 我們說“線性”和“非線性”,只在邏輯層次上討論,而不考慮儲存層次, 所以雙向連結串列和迴圈連結串列依舊是線性表。 在資料結構邏輯層次上細分,線性表可分為一般線性表和受限線性表。 一般線性表也就是我們通常所說的“線性表”,可以自由的刪除或新增結點。受限線性表主要包括棧和佇列,受限表示對結點的操作受限制。 因此,線性表這種資料結構在實際應用中是廣泛採用的一種資料結構
以上為百度百科的定義。我們這次實現的是順序儲存結構
的線性表。按照順序讀取和儲存。
1.首先用介面把線性表需要實現的操作宣告。為了圖省事,其他的常用操作未進行定義,可以自己去實現。所有的add,remove等操作都沒有進行boolean值的返還。
public interface CetrinwList<E> {
/**
* 取得資料
*/
E get(int index);
/**
* 新增資料
*/
void add(E e);
/**
* 移除資料
*/
void remove(int index);
/**
* 插入資料
*/
void insert(int index,E e);
/**
* 是否存在資料
* @return
*/
boolean contains(Object o);
/**
* 獲得List長度
* @return
*/
int size();
/**
* 是否為空
* @return
*/
boolean isEmpty();
/**
* 清空
*/
void clearList();
}
2.實現定義好的介面。
public class CetrinwArrayList<E> implements CetrinwList<E>{
/**
* 陣列預設長度
*/
private static final int DEFAULT_SIZE = 10;
/**
* 儲存佇列中的元素
*/
private Object[] elements = null;
/**
*陣列大小指標
*/
private int capacity;
/**
* 當前遊標
*/
private int current;
public CetrinwArrayList(){
this(DEFAULT_SIZE);
}
public CetrinwArrayList(int size){
if(size < 0){
throw new RuntimeException("陣列大小不能小於0");
}else{
this.elements = new Object[size];
this.current = 0;
capacity = size;
}
}
public E get(int index) {
confirmIndex(index);
return (E) this.elements[index];
}
public void add(E e) {
confirmSize();
this.elements[current] = e;
this.current++;
}
public void remove(int index) {
confirmIndex(index);
for (int i = index; i < elements.length; i++) {
if(i + 1 < elements.length){
elements[i] = elements[i+1];
}
}
current--;
}
public void insert(int index,E e) {
confirmIndex(index);
for (int i = 0; i < elements.length; i++) {
if(i >= index && i+2 < elements.length){
elements[i] = e;
elements[i+1] = elements[i+2];
}
}
current++;
}
public boolean contains(Object o) {
for (Object element : this.elements) {
if(o.equals(element)){
return true;
}
}
return false;
}
public int size() {
return this.current;
}
public boolean isEmpty() {
if(this.current >0){
return true;
}
return false;
}
public void clearList() {
elements = new Object[DEFAULT_SIZE];
}
/**
* 確認當前陣列的容量,如果滿足,則不操作,如果不滿足,則增加空間
*/
private void confirmSize(){
if(this.current == this.capacity){
this.capacity = this.capacity + this.DEFAULT_SIZE;
Object[] newElemets = new Object[this.capacity];
for (int i = 0; i < this.elements.length; i++) {
newElemets[i] = this.elements[i];
}
this.elements = newElemets;
}
}
/**
* 判斷下標是否越界
*/
private void confirmIndex(int index){
if(index > capacity || index < 0){
throw new RuntimeException("下標越界");
}
}
}
3.Junit的測試類
@Test
public void cetrinWArrayListTest(){
CetrinwList<String> list = new CetrinwArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
System.out.println("下標為3的元素為"+list.get(3));
System.out.println("陣列size:"+list.size());
list.remove(2);
System.out.print("remove後的陣列size:"+list.size());
System.out.println("remove後的陣列:");
for (int i = 0; i < list.size() ; i++) {
System.out.print(list.get(i)+",");
}
list.insert(3,"gg");
System.out.println("");
System.out.println("insert後的陣列:");
for (int i = 0; i < list.size() ; i++) {
System.out.print(list.get(i)+",");
}
}
4.執行結果
下標為3的元素為d
陣列size:4
remove後的陣列size:3remove後的陣列:
a,b,d,
insert後的陣列:
a,b,d,gg,