自定义线性表的简单例子

来源:互联网 发布:php伪造referer跳转 编辑:程序博客网 时间:2024/05/02 00:05

 

 

/*
 * 创建日期 2005-2-5
 *
 * TODO 要更改此生成的文件的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */

/**
 * @author bitan
 *
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
public class Test4 {
    class Digital {
        private final int initSize;
        private final int increase;
        private Object[] arrays;
        private int items;
        private int capacity;
        public void removeAll(int offset, int length) {
            if (offset < 0 || length < 0 || (offset + length) > items)
                throw new IllegalArgumentException("Arguments may be illegal.");
            items -= length;
            capacity -= ((capacity -items) / increase) * increase;
            Object[] temps = new Object[capacity];
            for (int i = 0; i < offset; i++) {
             temps[i] = arrays[i];
            }
            for (int i = offset; i < items; i++) {
             temps[i] = arrays[i + length];
            }

            arrays = temps;
        }
        public void addAll(Object[] os) {
            addAll(items, os);
        }
        public void addAll(Digital d) {
            addAll(items, d);
        }
        public void addAll(int index, Object[] os) {
            if (index < 0) throw new IllegalArgumentException("Arguments may be illegal.");
            if (os == null || os.length == 0) {
                return;
            }
            items += os.length;
            if (items > capacity) {
                capacity += (((items - capacity)) / increase + 1) * increase;
            }
           
            Object[] temps = new Object[capacity];
            for (int i = 0; i < index; i++) {
                temps[i] = arrays[i];
            }
            for (int i = index, j = 0; j < os.length; i++, j++) {
             temps[i] = os[j];
            }
            for (int i = (index + os.length), j = index; i < items; i++, j++) {
             temps[i] = arrays[j];
            }

            arrays = temps;
        }
        public void addAll(int index, Digital d) {
            addAll(index, d.toArrays());
        }
        public Object[] toArrays() {
            Object[] temps = new Object[items];
            for (int i = 0; i < items; i++) {
                temps[i] = arrays[i];
            }
            return temps;

        }
        public void removeAll() {
            init();
        }
        private void init() {
            arrays = new Object[initSize];
            items = 0;
            capacity = initSize;
        }
        public int getCapacity() {
            return capacity;
        }
        public int size() {
            return items;
        }
        public Digital() {
            initSize = 4;
            increase = 2;
            init();
        }
        public Digital(int initSize, int increase) {
             if (initSize < 0 || increase <= 0)
                throw new IllegalArgumentException("arguments may be illegal.");
             this.increase = increase;
             this.initSize = initSize;
             init();
        }
        public Object elementAt(int index) {
            if (index < 0 || index > this.items) {
                throw new IllegalArgumentException("arguments may be illegal.");
            }
            return this.arrays[index];
        }
        public Object getFirstElement() {
            return arrays[0];
        }
        public Object getLastElement() {
            return arrays[items-1];
        }
        public void removeLastElement() {
            removeElement(items - 1);
        }
        public void removeFirstElement() {
            removeElement(0);
        }
        public void removeElement(int index) {
            if (index < 0 || index > this.items) {
                throw new IllegalArgumentException("arguments may be illegal.");
            }
            while(index < items -1) {
                arrays[index] = arrays[index + 1];
                index++;
            }
            arrays[index] = null;
            items--;
            if (items % increase == 0) {
                this.capacity -= increase;

                Object[] temps = new Object[capacity];
                for (int i = 0; i < items; i++) {
                 temps[i] = arrays[i];
                }
                arrays = temps;
            }
        }

        public void insertElement(int index, Object o) {
            if (o == null || index < 0 || index > items)
                throw new IllegalArgumentException("Argument may be illegal.");
            items++;
            if (items > capacity)
                capacity += increase;
            Object[] temps = new Object[capacity];
            for (int i = 0; i < index; i++ ) {
                temps[i] = arrays[i];
            }
            temps[index] = o;
            for (int i = (index + 1); i < items; i++) {
                temps[i] = arrays[i - 1];
            }
            arrays = temps;
        }
        public void addElement(Object o) {
            insertElement(items, o);
        }

        public String toString() {
            StringBuffer sb = new StringBuffer();
            sb.append(this.getClass().getName() + " : (size=" + items + ", capacity=" + capacity + ") [");
            for (int i = 0; i < this.items; i++) {
             sb.append(arrays[i]);
                if (i != items -1) {
                  sb.append(", ");  
                }
            }
            sb.append("]");
            return sb.toString();
        }
    }

 public static void main(String[] args) {
        Test4 t4 = new Test4();
        Digital d = t4.new Digital(3,2);
        Digital d2 = t4.new Digital(6, 3);
        String[] sArr = new String[8];
        for (int i = 0; i < sArr.length; i++) {
            sArr[i] = "aaaa" + i;
        }
        for (int i = 0; i < 4; i++) {
            d.addElement("bbbb" + i);
        }
        d2.addAll(sArr);
        System.out.println(d + "/n" + d2);
        d2.addAll(2, d);
        System.out.println(d2);
        d2.removeAll(5, 4);
        System.out.println(d2);
        System.out.println("first=" + d2.getFirstElement() + ", last=" + d2.getLastElement() + ", index[5]=" + d2.elementAt(5)); 

        d2.insertElement(7, "cccc0");
        System.out.println(d2); 
 }
}

结果:

 

Test4$Digital : (size=4, capacity=5) [bbbb0, bbbb1, bbbb2, bbbb3]
Test4$Digital : (size=8, capacity=9) [aaaa0, aaaa1, aaaa2, aaaa3, aaaa4, aaaa5, aaaa6, aaaa7]
Test4$Digital : (size=12, capacity=15) [aaaa0, aaaa1, bbbb0, bbbb1, bbbb2, bbbb3, aaaa2, aaaa3, aaaa4, aaaa5, aaaa6, aaaa7]
Test4$Digital : (size=8, capacity=9) [aaaa0, aaaa1, bbbb0, bbbb1, bbbb2, aaaa5, aaaa6, aaaa7]
first=aaaa0, last=aaaa7, index[5]=aaaa5

Test4$Digital : (size=9, capacity=9) [aaaa0, aaaa1, bbbb0, bbbb1, bbbb2, aaaa5, aaaa6, cccc0, aaaa7]

结论:

 

一、设计线性表时,最复杂的是按索引增加和删除方法,最简单的是查找方法。

二、当实现几个功能类似的方法时,应该优先实现有索引参数的方法。然后,无索引参数的方法可以简单调用有索引参数的方法。

原创粉丝点击