java - 当类型未知时如何迭代 Iterable 对象?

标签 java algorithm iterable

对于家庭作业,我需要实现自己的 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 类和一个包含 K 类型键和 V 类型值的自定义 Entry 类。

我需要能够获取具有任何类型 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);
    }
}

请注意,这里的方差只是提供了更大的灵 active ——你可以有一个 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 类是什么样的。)

关于java - 当类型未知时如何迭代 Iterable 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15295526/

相关文章:

java - 调整 JFrame 中 JEditorPane 的大小

python - 在 if 语句中实现 for 循环

algorithm - 用 1 种颜色对图表进行部分着色

python - 为什么我得到Int对象不是可迭代的错误?如果下次出现此类错误,应该采取什么方法?

python - 创建一个非迭代器可迭代对象

java - 如何创建根据列出的代码显示平均值的方法

java - BufferedImage 如何阻止所有图像使用最后一张图像的颜色

algorithm - 查找图中访问某些节点的最短路径

python 3 : How to write a __iter__ method for derived class so that it extends on the behaviour of the base class' __iter__ method

java - 获取 Facebook 用户数据