2010-02-14 59 views
4

我已經實現了優先隊列接口來製作堆。你能告訴我如何在上面實現一個迭代器嗎?點我一些適當的教程,我是新來的Java和在這裏很短的截止日期。 其實我需要一種方法來根據Object.id從堆中找到和修改一個對象。我不在乎它是否是O(n)。如何在java中使用迭代器?

public interface PriorityQueue { 

    /** 
    * The Position interface represents a type that can 
    * be used for the decreaseKey operation. 
    */ 
    public interface Position { 

     /** 
     * Returns the value stored at this position. 
     * @return the value stored at this position. 
     */ 
     Comparable getValue(); 
    } 

    Position insert(Comparable x); 

    Comparable findMin(); 

    Comparable deleteMin(); 

    boolean isEmpty(); 

    int size(); 

    void decreaseKey(Position p, Comparable newVal); 
} 

//二叉堆類

public class OpenList implements PriorityQueue { 

    public OpenList() { 
     currentSize = 0; 
     array = new Comparable[DEFAULT_CAPACITY + 1]; 
    } 

    public OpenList(int size) { 
     currentSize = 0; 
     array = new Comparable[DEFAULT_CAPACITY + 1]; 
     justtocheck = new int[size]; 
    } 

    public OpenList(Comparable[] items) { 
     currentSize = items.length; 
     array = new Comparable[items.length + 1]; 

     for (int i = 0; i < items.length; i++) { 
      array[i + 1] = items[i]; 
     } 
     buildHeap(); 
    } 

    public int check(Comparable item) { 
     for (int i = 0; i < array.length; i++) { 
      if (array[1] == item) { 
       return 1; 
      } 
     } 
     return array.length; 
    } 

    public PriorityQueue.Position insert(Comparable x) { 
     if (currentSize + 1 == array.length) { 
      doubleArray(); 
     } 

     // Percolate up 
     int hole = ++currentSize; 
     array[ 0] = x; 

     for (; x.compareTo(array[hole/2]) < 0; hole /= 2) { 
      array[hole] = array[hole/2]; 
     } 
     array[hole] = x; 

     return null; 
    } 

    public void decreaseKey(PriorityQueue.Position p, Comparable newVal) { 
     throw new UnsupportedOperationException(
      "Cannot use decreaseKey for binary heap"); 
    } 

    public Comparable findMin() { 
     if (isEmpty()) { 
      throw new UnderflowException("Empty binary heap"); 
     } 
     return array[ 1]; 
    } 

    public Comparable deleteMin() { 
     Comparable minItem = findMin(); 
     array[ 1] = array[currentSize--]; 
     percolateDown(1); 

     return minItem; 
    } 

    private void buildHeap() { 
     for (int i = currentSize/2; i > 0; i--) { 
      percolateDown(i); 
     } 
    } 

    public boolean isEmpty() { 
     return currentSize == 0; 
    } 

    public int size() { 
     return currentSize; 
    } 

    public void makeEmpty() { 
     currentSize = 0; 
    } 
    private static final int DEFAULT_CAPACITY = 100; 
    private int currentSize;  // Number of elements in heap 
    private Comparable[] array; // The heap array 
    public int[] justtocheck; 

    private void percolateDown(int hole) { 
     int child; 
     Comparable tmp = array[hole]; 

     for (; hole * 2 <= currentSize; hole = child) { 
      child = hole * 2; 
      if (child != currentSize && 
       array[child + 1].compareTo(array[child]) < 0) { 
       child++; 
      } 
      if (array[child].compareTo(tmp) < 0) { 
       array[hole] = array[child]; 
      } else { 
       break; 
      } 
     } 
     array[hole] = tmp; 
    } 

    private void doubleArray() { 
     Comparable[] newArray; 

     newArray = new Comparable[array.length * 2]; 
     for (int i = 0; i < array.length; i++) { 
      newArray[i] = array[i]; 
     } 
     array = newArray; 

} 

回答

1

你的底層數據結構是數組,這是難以編寫Java風格的迭代器。您可以嘗試創建一個實現java.util.Iterator的容器類,該容器包含對Comparable元素及其當前數組索引的引用。移動容器時,您需要手動更新索引。

+0

聽起來合乎邏輯。也許一個列表有一個數組的基礎呢?嗯... http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html – MatrixFrog 2010-02-14 01:41:40

+0

謝謝。我認爲這裏最簡單快捷的方法是根據我的需要重新編寫堆類。 – 2010-02-14 01:55:00