Java實現順序表算法:
1:首先我們需要定義我們的接口,關於順序表的一些基本的操作:順序表中的操作都有增刪改查。
//List接口 public interface IList { //返回線性表的大小,即數據元素的個數。 public int getSize(); //如果線性表為空返回 true,否則返回 false。 public boolean isEmpty(); //判斷線性表是否包含數據元素 e public boolean contains(Object e); //返回數據元素 e 在線性表中的序號 public int indexOf(Object e); //將數據元素 e 插入到線性表中 i 號位置 public void insert(int i, Object e) throws OutOfBoundaryException; //將數據元素 e 插入到元素 obj 之前 public boolean insertBefore(Object obj, Object e); //將數據元素 e 插入到元素 obj 之后 public boolean insertAfter(Object obj, Object e); //刪除線性表中序號為 i 的元素,並返回之 public Object remove(int i) throws OutOfBoundaryException; //刪除線性表中第一個與 e 相同的元素 public boolean remove(Object e); //替換線性表中序號為 i 的數據元素為 e,返回原數據元素 public Object replace(int i, Object e) throws OutOfBoundaryException; //返回線性表中序號為 i 的數據元素 public Object get(int i) throws OutOfBoundaryException; }
2.我們在這里還需要比較元素的大小,我們就寫一個比較元素大小的策略的接口。
//對象比較策略接口 public interface IStrategy { //判斷兩個數據元素是否相等 public boolean equal(Object obj1, Object obj2); /** * 比較兩個數據元素的大小 * 如果 obj1 < obj2 返回-1 * 如果obj1 = obj2 返回0 * 如果obj1 > obj2 返回1 */ public int compare(Object obj1, Object obj2); }
3.寫我們這里需要的策略的實現。
/** * 默認比較策略類 */ public class DefaultStrategy implements IStrategy { @Override public boolean equal(Object obj1, Object obj2) { return obj1.equals(obj2); } @Override public int compare(Object obj1, Object obj2) { return obj1.toString().compareTo(obj2.toString()); } }
4.我們策略已經寫完,下一步我們就寫我們順序表的實現。
//順序表類 public class MyArrayList implements IList{ public static void main(String[] args) { // TODO Auto-generated method stub } private final int LEN = 8; //數組的默認大小 private IStrategy strategy; //數據元素比較策略 private int size; //線性表中數據元素的個數 private Object[] elements; //數據元素數組 //構造方法 public MyArrayList(){ this(new DefaultStrategy()); } public MyArrayList(IStrategy strategy){ this.strategy = strategy; size = 0; elements = new Object[LEN]; } @Override public int getSize() { // TODO Auto-generated method stub return this.size; } @Override public boolean isEmpty() { // TODO Auto-generated method stub return size == 0; } @Override public boolean contains(Object e) { // TODO Auto-generated method stub for(int i = 0; i < size; i++){ if(this.strategy.equal(e, elements[i])){ return true; } } return false; } @Override public int indexOf(Object e) { // TODO Auto-generated method stub for( int i = 0; i < size; i++){ if(strategy.equal(e, elements[i])){ return i; } } return -1; } @Override public void insert(int i, Object e) throws OutOfBoundaryException { // TODO Auto-generated method stub //檢查下標越界 if( i < 0 || i >= size){ throw new OutOfBoundaryException("指定的插入序號越界。"); } //檢查線性表數組的容量 if (size >= elements.length){ expandSpace(); } //將插入位置后的數據元素依次向后移動一個單位 for( int j = size; j > i; j--){ elements[j] = elements[j-1]; } //插入數據 elements[i] = e; size++; //元素個數加1 } //擴展順序表空間 private void expandSpace(){ Object[] a = new Object[elements.length*2]; for (int i=0; i<elements.length; i++) { a[i] = elements[i]; } elements = a; } @Override public boolean insertBefore(Object obj, Object e) { // TODO Auto-generated method stub //找到插入位置 int i = indexOf(obj); if (i<0) { return false; } insert(i,e); return true; } @Override public boolean insertAfter(Object obj, Object e) { // TODO Auto-generated method stub int i = indexOf(obj); if (i<0) { return false; } insert(i+1,e); return true; } @Override public Object remove(int i) throws OutOfBoundaryException { // TODO Auto-generated method stub //首先檢查越界 if (i<0||i>=size) { throw new OutOfBoundaryException("錯誤,指定的刪除序號越界。"); } Object obj = elements[i]; //被刪除的數據元素后的數據前移一個單位 for (int j=i; j<size-1; j++) { elements[j] = elements[j+1]; } // elements[--size] = null; return obj; } @Override public boolean remove(Object e) { // TODO Auto-generated method stub //找到被刪除數據元素的位置 int i = indexOf(e); if (i<0) { return false; } remove(i); return true; } @Override public Object replace(int i, Object e) throws OutOfBoundaryException { // TODO Auto-generated method stub if (i<0||i>=size){ throw new OutOfBoundaryException("錯誤,指定的序號越界。"); } Object obj = elements[i]; elements[i] = e; return obj; } @Override public Object get(int i) throws OutOfBoundaryException { // TODO Auto-generated method stub if (i<0||i>=size){ throw new OutOfBoundaryException("錯誤,指定的序號越界。"); } return elements[i]; } }
5.上面的代碼中我們的函數都拋出了一個異常,這個異常是我們自己定義的。
public class OutOfBoundaryException extends RuntimeException{ public OutOfBoundaryException(String err){ super(err); } }
