用順序存儲(數組)來實現列表

一、數據結構基本概念

-數據:一切可以輸入計算機並能被處理的都是數據;

-數據元素

-數據對象

學生-數據對象,姓名,性別,身高,課程代號是數據元素,身高是數據項。

二、數據結構(data structure)

》邏輯結構

-集合:元素羅列在一起

-線性結構:元素前後相繼(一一對應)

-樹形結構:元素存在一對多的關係

-圖結構或網狀結構:元素之間存在多對多的關係。

》存儲結構

-順序存儲:地址連續,用數組。

-鏈式存儲:地址不連續,用指針(引用,面向對象)。

樹和圖基本都是鏈式存儲,其他存儲結構基本都是順序存儲和鏈式存儲。

三、數據結構就是用一種特別的方式存起來,便於方便的取出來。

數據結構的主要運算(操作)

爲了某種特殊需求(取數據),而專門設計的數據存儲方式。

①建立一個數據結構;②消除一個數據結構;③刪除;④插入;⑤訪問;⑥修改;⑦排序;⑧查找;

四、列表:順序表和鏈表

>定義列表接口

>用數組實現-MyArrayList

>實現鏈表

>java List API

>相關技巧

五、用順序存儲(數組)來實現列表

5.1建一個接口

public interface MyList {
	void add(Object element);//新增一個元素
	void delete(Object element);//刪除相同元素
	void deleteByIndex(int index);//根據索引刪除元素
	void update(int index,Object newElement);//將指定索引位置的元素替換成新元素
	boolean contains(Object target);//當前列表中是否含有target元素
	Object at(int index);//根據指定索引返回元素
	int indexOf(Object element);//查找element所在的索引,如果沒有返回-1
}

5.2寫實現類

public class MyArrayList implements MyList{
	private Object[] elements;//真正存儲元素的底層結構
	private int size;//元素個數
	private int capacity=10;//容量
	
	public MyArrayList(int capacity) {//指定數組容量
		this.capacity = capacity;
		elements=new Object[capacity];
	}
	public MyArrayList() {//默認數組容量
		elements=new Object[capacity];
	}
	@Override
	public void add(Object element) {
		if(size==capacity) {//擴容
			capacity*=2;
			Object[] newArr=new Object[capacity];//因爲數組長度不可變,所以要新建一個新的數組,把舊的數組元素拷過來
			for(int i=0;i<size;i++) {//O(n),耗費時間,耗費內存
				newArr[i]=elements[i];
			}
			elements=newArr;//把舊的那個數組丟掉
		}else {
		elements[size++]=element;
		}
	}

	@Override
	public void delete(Object element) {
		int index=indexOf(element);
		if(index>=0) {
			deleteByIndex(index);
		}
	}

	@Override
	public void deleteByIndex(int index) {//緊密
			Object[] newArr=new Object[capacity-1];//因爲數組長度不可變,所以要新建一個新的數組,把舊的數組元素拷過來
			for(int i=0;i<size;i++) {//O(n),耗費時間,耗費內存
				if(i==index) continue;
				newArr[i]=elements[i];
			}
			elements=newArr;//把舊的那個數組丟掉	
	}

	@Override
	public void update(int index, Object newElement) {
		elements[index]=newElement;
	}

	@Override
	public boolean contains(Object target) {
		return indexOf(target)>0;
	}

	@Override
	public Object at(int index) {
		return elements[index];
	}
	@Override
	public int indexOf(Object element) {
		for(int i=0;i<size;i++) {
			if(elements[i].equals(element)) {
				return i;
			}
		}
		return -1;
		
	}
	//重寫toString
	@Override
	public String toString() {
		StringBuilder sb=new StringBuilder("[");
		for(int i=0;i<size;i++) {
			sb.append(elements[i]+(i==size-1?"":","));
		}
		sb.append("]");
		return sb.toString();
		//return "MyArrayList [elements=" + Arrays.toString(elements) + "]";//輸出結果爲:MyArrayList [elements=[周婷婷, 樂觀, 勤奮, null, null, null, null, null, null, null]]
	}

	
}

5.3測試類

public class MyArrayListTest{
	public static void main(String[] args) {
		MyArrayList list=new MyArrayList();
		list.add("周婷婷");
		list.add("勤奮");
		list.add("樂觀");
		list.add("修改內容");
		list.add("刪除內容");
		list.add("刪除下標");
		list.delete("刪除內容");
		list.deleteByIndex(5);	
		list.update(3, "內容被修改了");
		boolean contain= list.contains("樂觀");
		int indexOf=list.indexOf("勤奮");
		System.out.println(list);
		System.out.println(contain);
		System.out.println(indexOf);
	}
}

5.4運行結果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章