Revising DoubleArraySequence



需要帮助开始实现链表而不是DoubleArraySeq的数组。

认为某些方法(例如确保容量(会过时,所以我将其排除在外。

任何帮助将不胜感激。谢谢。

public class DoubleArraySeq implements Cloneable {
private double[] data;
private int manyItems;
private int currentIndex;

public DoubleArraySeq() {
    this(10);
}

public DoubleArraySeq(int initialCapacity) {
    if(initialCapacity <= 0) {
        throw new IllegalArgumentException("Negative initialCapacity: " + initialCapacity);
    }
    data = new double[initialCapacity];
    manyItems = 0;
    currentIndex = -1;
}
public void addAfter(double element) {
    if(manyItems == data.length) {
        ensureCapacity(manyItems * 2 + 1);
    }
    if(!isCurrent()) {
        currentIndex = 0;
    } else {
        currentIndex++;
    }
    for(int i = currentIndex; i < manyItems; i++) {
        data[i + 1] = data[i];
    }
    data[currentIndex] = element;
    manyItems++;
}
public void addAll(DoubleArraySeq addend) {
    if(addend == null) {
        throw new NullPointerException("addend Array is Null Point.");
    }
    this.ensureCapacity(manyItems + addend.manyItems);
    System.arraycopy(addend.data, 0, this.data, this.manyItems, addend.manyItems);
    manyItems += addend.manyItems;
}
public void addBefore(double element) {
    if(manyItems == data.length) {
        ensureCapacity(manyItems * 2 + 1);
    }
    if(!isCurrent()) {
        currentIndex = 0;
    }
    for(int i = manyItems; i > currentIndex; i--) {
        data[i] = data[i - 1];
    }
    data[currentIndex] = element;
    manyItems++;
}
public void addEnd(double element) {
    if(manyItems == data.length) {
        ensureCapacity(manyItems * 2 + 1);
    }
    currentIndex = manyItems;
    data[currentIndex] = element;
    manyItems++;
}
public void addFront(double element) {
    if(manyItems == data.length) {
        ensureCapacity(manyItems * 2 + 1);
    }
    currentIndex = 0;
    for(int i = manyItems; i > currentIndex; i--) {
        data[i] = data[i - 1];
    }
    data[currentIndex] = element;
    manyItems++;
}
public void advance() {
    if(!isCurrent()) {
        throw new IllegalStateException("There is not current element, so it can't advance");
    }
    currentIndex++;
}
@Override
public DoubleArraySeq clone() {
    // Clone a DoubleArraySeq object.
    DoubleArraySeq answer;
    try {
        answer = (DoubleArraySeq) super.clone();
    } catch(CloneNotSupportedException e) {
        throw new RuntimeException("This class does not implement Cloneable");
    }
    answer.data = data.clone();
    return answer;
}
public void ensureCapacity(int minimumCapacity) {
    int ensuredCapacity;
    if(data.length < minimumCapacity) {
        ensuredCapacity = minimumCapacity;
    } else {
        ensuredCapacity = data.length;
    }
    double[] biggerArray = new double[ensuredCapacity];
    System.arraycopy(data, 0, biggerArray, 0, manyItems);
    data = biggerArray;
}
public int find(double element) {
    for(int i = 0; i < manyItems; i++) {
        if(element == data[i]) {
            this.currentIndex = i;
            return i;
        }
    }
    return -1;
}
public int getCapacity() {
    return data.length;
}
public double getCurrent() {
    if(this.isCurrent()) {
        return data[currentIndex];
    } else {
        throw new IllegalStateException("there is no current element");
    }
}
public int getSize() {
    return this.manyItems;
}
public void gotoEnd() {
    if(manyItems <= 0) {
        throw new IllegalStateException("The sequence is empty");
    }
    currentIndex = manyItems - 1;
}
public void gotoStart() {
    if(data.length > 0) {
        currentIndex = 0;
    }
}
public boolean isCurrent() {
    return currentIndex >= 0;
}
public void removeCurrent() {
    if(manyItems - 1 < currentIndex) {
        throw new IllegalStateException("There is no current element.");
    }
    for(int i = currentIndex; i < manyItems; i++) {
        try {
            data[i] = data[i + 1];
        } catch(ArrayIndexOutOfBoundsException e) {
        }
    }
    data[manyItems-- - 1] = 0;
}
public void removeEnd() {
    this.gotoEnd();
    this.removeCurrent();
}
public void removeFront() {
    this.gotoStart();
    this.removeCurrent();
}
public double retrieveElement(int i) {
    if(i < 0 || i >= manyItems) {
        throw new IllegalArgumentException("Given index of " + i + " is outside the bounds of the sequence");
    }
    return data[i];
}
public void setCurrent(int i) {
    if(i < 0 || i >= manyItems) {
        throw new IllegalArgumentException("Given index of " + i + " is outside the bounds of the sequence");
    }
    this.currentIndex = i;
}
@Override
public String toString() {
    String ret = "";
    ret += "The sequence: ";
    for(int i = 0; i < manyItems; i++) {
        ret += data[i] + " ";
    }
    ret += "nNumber of elements: " + manyItems + "n";
    try {
        ret += "Current element: " + getCurrent();
    } catch(IllegalStateException e) {
        ret += "Current element: N/A";
    }
    return ret;
}
public void trimToSize() {
    double[] trimmedArray;
    if(data.length != manyItems) {
        trimmedArray = new double[manyItems];
        System.arraycopy(data, 0, trimmedArray, 0, manyItems);
        data = trimmedArray;
    }
}

}

对于依赖于单链表或双链表的链表 首先你必须创建节点

Node<E> {
        E data;
        Node<E> next;
        Node(E data, Node<E> next) {
            this.data = data;
            this.next = next;
        }
    }

完整代码示例的单向链表的一些代码参考我的 github

public class SinglyLinkedList<E> {
    private Node<E> head;
    private int size = 0;
    public int getSize() {
        return size;
    }
    /**
     * Inserts the specified element at the beginning of this list.
     *
     * @param e
     *            the element to add
     */
    public void addFirst(E e) {
        linkFirst(e);
    }
    /**
     * Appends the specified element to the end of this list.
     *
     * @param e
     *            element to be appended to this list
     * @return {@code true}
     */
    public boolean add(E e) {
        linkLast(e);
        return true;
    }
    private void linkFirst(E e) {
        final Node<E> f = head;
        Node<E> newNode = new Node<E>(e, null);
        head = newNode;
        if (f != null) {
            newNode.next = f;
        }
        size++;
    }
    private void linkLast(E e) {
        Node<E> newNode = new Node<E>(e, null);
        if (head == null) {
            head = newNode;
        } else {
            Node<E> head = this.head;
            while (head.next != null) {
                head = head.next;
            }
            head.next = newNode;
        }
        size++;
    }

相关内容

  • 没有找到相关文章

最新更新