數組
數組是資料呈線性排列的一種資料結構,在數組中,通路資料十分簡單,而添加和删除資料比較耗費功夫

a是數組的名字,後面的"[]"中的數字表示該資料是數組中的第幾個資料(這個數字叫做“數組下标”,下标從0開始計數),比如red就是數組a的第一個資料。
數組中的資料按順序存儲在記憶體的連續空間内,由于資料是存儲在連續的空間内的,是以每個資料的記憶體位址(在記憶體的位置都可以通過數組下标算出,我們也就可以直接通路目标資料(“随機通路”)。
通路
若現在向通路red,隻需要指定a[0]就可以通路
删除
但是如果想在任意位置上添加或删除資料,線性表的操作就會很複雜,這涉及到元素的移動,
例如将orange添加到第二個位置
首先要確定線性表的末尾還有存儲空間,
删除
如果要删除資料,也需要元素進行移動,例如删除orange元素
首先删除目标資料(這裡指green)
代碼實作
首先先建立一個接口(MyList),接口含有增加(add),删除(remove),擷取指定下标的元素(getData)擷取元素個數(size),判斷是否含有元素(isEmpty),清空元素(clear)
代碼如下:
public interface MyList {
public void add(int index,Object obj) throws Exception;//增加
public Object remove(int index) throws Exception;//删除
public Object getData(int index) throws Exception;//擷取指定下标的元素
public int size();//擷取元素個數
public boolean isEmpty();//判斷是否含有元素
public void clear();//清空元素
}
然後建立線性表類(MyArray),實作MyList接口,
類中屬性:
Object數組(o):用于存儲資料
常量(MAX_SIZE):表示線性表的最大存儲容量
int類型的size:表示目前線性表的元素個數
類中有兩個構造方法
預設構造方法:預設線性表最大容量為10
帶MAX_SIZE參數的構造方法:可自定義線性表的最大容量
若幹個getter和settter方法
private Object[] o;//用于存儲資料
final int MAX_SIZE;//表示線性表的最大存儲容量
private int size;//表示目前線性表的元素個數
public MyArray() {
MAX_SIZE = 10;
size = 0;
o = new Object[MAX_SIZE];
}
public MyArray(int MAX_SIZE) {
this.MAX_SIZE = MAX_SIZE;
size = 0;
o = new Object[this.MAX_SIZE];
}
public Object[] getO() {
return o;
}
public void setO(Object[] o) {
this.o = o;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
實作接口中的方法:
增加(add)方法(如何設計add方法?)
最後一個元素的下标是size-1,要執行往右移動的操作也就是說下标增加了1,最後一個元素的下标變成了size(size-1+1=size)以此類推一直往右移動,index-1就是要插入元素的下标,也就是說index-1這個位置移完就不需要再移動
public void add(int index, Object obj) throws Exception {
for (int i = size; i > index ; i--) {
o[i] = o[i-1];
}
o[index-1] = obj;
}
但是java是具有健壯性這個特性的,是以我們也要讓自己的代碼具有健壯性,檢查是否還有空位,檢查傳入的參數index是否合法
if (size == MAX_SIZE){
throw new Exception("線性表已滿");
}
if (index < 0 || index > size){
throw new Exception("參數不合法");
}
完整代碼就是
public void add(int index, Object obj) throws Exception {
if (size == MAX_SIZE){
throw new Exception("線性表已滿");
}
if (index < 0 || index > size){
throw new Exception("參數不合法");
}
for (int i = size; i > index0 ; i--) {
o[i] = o[i-1];
}
o[index-1] = obj;
}
删除(remove)方法(如何設計remove方法)
在删除元素之前先備份元素,删除元素是将元素往左移動,首先是将下标為index的元素移到下标為index的位置上,然後以此類推,直到最後一個元素(下标為size-1)也移動完畢
代碼如下
Object obj = o[index];//備份元素
if (index == size-1){
o[index] = null;
}
for (int i = index; i < size-1; i++) {
o[i] = o[i+1];//移動
}
同樣我們也要設立關卡,使得代碼更具有健壯性
if (size == 0){
throw new Exception("線性表為空,無法删除");
}
if (index < 0 || index > size){
throw new Exception("參數不合法");
}
完整代碼示例
public Object remove(int index) throws Exception {
if (size == 0){
throw new Exception("線性表為空,無法删除");
}
if (index < 0 || index > size-1){
throw new Exception("參數不合法");
}
Object obj = o[index];//備份元素for (int i = index; i < size-1; i++) {
o[i] = o[i+1];//移動
}
size--;
return obj;//傳回被删除的元素
}
專門用于列印線性表資料的方法
//列印線性表的元素
public void print(){
try {
for (int i = 0; i < size; i++) {
System.out.print(getData(i) + " ");
}
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
}
獲得元素的方法
public Object getData(int index) throws Exception {
return o[index];
}
獲得線性表個數
public int size(){
return size;
}
判斷是否線性表為空
public boolean isEmpty(){
return (size==0?true:false);
}
清空線性表
public void clear() {
size = 0;
}
public class Demo {
public static void main(String[] args) throws Exception {
MyArray m = new MyArray();
System.out.println(m.size());
for (int i = 0; i < 10; i++) {
m.add(i,i);//添加元素
}
m.print();//答應元素
System.out.println();
m.remove(9);//删除指定元素
m.print();//删除後列印
m.add(9,11);//添加元素
m.print();//添加後列印
System.out.println(m.isEmpty());//是否為空,false表示不為空
m.clear();//清空線性表
System.out.println(m.isEmpty());//是否為空,true表示為空
}
}
寫在最後