2017-05-14 5 views
0

DoubleArraySeqの配列の代わりにリンクリストを実装するのを手伝ってください。DoubleArraySequenceの改訂

sureCapacityなどのいくつかのメソッドはobseleteなので、私はそれを残しておきます。

ご協力いただければ幸いです。ありがとう。リンクリストについては

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

}

+1

ここでは一般的な助けを求めるのはあまりにも広すぎ、非効率的です。あなたはどんな特定の問題を抱えていますか? –

+0

配列の代わりにリンクリストを使用できるように、このクラスを変更したいと考えています。 –

答えて

0

あなたは完全なコード例については、単独リンクリストのためのノード

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++; 
    } 
関連する問題