數據結構順序表Java實現


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);
    } 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM