簡體   English   中英

當類型未知時,如何迭代Iterable對象?

[英]How do I iterate over an Iterable object when the type is not known?

對於家庭作業,我需要實現自己的PriorityQueue和PriorityQueueSort。 我使用泛型來使其工作而沒有排序功能,但現在我被困在這里..

public static void PriorityQueueSort(Iterable<?> list, 
    PriorityQueue<?,?> pq) {
  if (!pq.isEmpty()) {
    throw new IllegalArgumentException("Non-Empty PriorityQueue");
  }

  for (Object obj : list) {

  }
}

我需要傳入一個列表和一個空的PriorityQueue,所以我最好猜測如何做到這一點就在上面。 我應該如何攻擊這個以便我可以遍歷未知類型的列表,並將具有正確類型的該列表中的每個元素添加到優先級隊列中?


編輯:

由於確定我沒有提供足夠的信息,因此這里有一些細節。

我有一個自定義的PriorityQueue類,以及一個自定義的Entry類,它包含一個類型為K的鍵,其值為V.

我需要能夠使用任何類型T獲取任何可迭代列表並迭代它,獲取每個項目並將其添加到最初為空的PriorityQueue作為具有空值的鍵。 然后,我需要在我的PriorityQueue上連續調用removeMin()並將其按順序添加回相同的列表對象。

public class PriorityQueue<K extends Comparable<? super K>,V> {

  private Entry<K,V> _head;
  private Entry<K,V> _tail;
  private int _size;

  public PriorityQueue() {
    this._head = null;
    this._tail = null;
    this._size = 0;
  }

  public int size() {
    return _size;
  }

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

  public Entry<K,V> min() {
    if (_head == null) {
      return null;
    }
    Entry<K,V> current = _head;
    Entry<K,V> min = _head;;

    while (current != null) {
      if (current.compareTo(min) < 0) {
        min = current;
      }
      current = current.getNext();
    }
    return min;
  }

  public Entry<K,V> insert(K k, V x) {
    Entry<K,V> temp = new Entry<K,V>(k,x);
    if (_tail == null) {
      _tail = temp;
      _head = temp;
    }
    else {
      _tail.setNext(temp);
      temp.setPrev(_tail);
      _tail = temp;
    }
    return temp;
  }

  public Entry<K,V> removeMin() {
    Entry<K,V> smallest = min();
    smallest.getPrev().setNext(smallest.getNext());
    smallest.getNext().setPrev(smallest.getPrev());

    return smallest;
  }

  public String toString() {
    return null;
  }

  public static <K> void PriorityQueueSort(Iterable<? extends K> list,
        PriorityQueue<? super K, ?> queue) {

      for (K item : list) {
          queue.insert(item, null);
      }

      list.clear();
  }

  public static void main(String[] args) {
    PriorityQueue<Integer, Integer> pq = 
        new PriorityQueue<Integer, Integer>();

    pq.insert(4, 2);
    pq.insert(5, 1);


    System.out.println(pq.min().toString());
  }
}

你目前得到的東西在方法簽名方面沒有意義 - 它可以讓你傳遞一個List<Button>和一個PriorityQueue<String>

我懷疑你真的想要這樣的東西:

public static <T> void prioritySortQueue(Iterable<? extends T> iterable,
    PriorityQueue<? super T> queue) {

    for (T item : iterable) {
        queue.add(item);
    }
}

請注意,這里的方差只是提供了更大的靈活性 - 例如,你可以有一個List<Circle>但是一個PriorityQueue<Shape> ,它仍然是類型安全的。

編輯:現在我們有更多的細節,我想你想要這樣的東西:

public static <K> void prioritySortQueue(Iterable<? extends K> iterable,
    PriorityQueue<? super K, ?> queue) {

    for (T item : iterable) {
        queue.put(item, null);
    }
}

(假設你有一個put方法。我們仍然不知道你的PriorityQueue類是什么樣的。)

您需要使方法通用,以便您可以引用類型:

public static <T> void PriorityQueueSort(Iterable<T> list, 
PriorityQueue<?,T> pq) {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM