2013-03-08 55 views
3

对于家庭作业,我需要实现我自己的PriorityQueue和PriorityQueueSort。我使用泛型得到它的工作没有排序功能,但现在我在这里停留..如何在类型未知时迭代Iterable对象?

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的值

我需要能够采取任何可迭代列表与任何类型的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()); 
    } 
} 
+1

您的签名已损坏;它让我添加'Iterable '到'PriorityQueue '。 – SLaks 2013-03-08 13:54:49

回答

2

你需要使该方法一般,让你可以参照类型:

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

你此刻已经得到了什么没有意义的方法签名方面 - 它会让你通过一个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>,它仍然类型安全。

编辑:现在我们有更多的细节,我想你想是这样的:(。假设你有一个put方法,我们仍然不知道你PriorityQueue类的样子)

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

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

+0

啊是的;我忘记了差异。 – SLaks 2013-03-08 13:58:00

+0

我有我自己的PriorityQueue 类和条目类...但我希望能够接受任何可迭代类型进行排序。我不知道这是否有所作为。 – agent154 2013-03-08 13:58:09

+1

@ agent154:除了您需要弄清楚如何在此方法中获取密钥之外,这没什么区别。 – SLaks 2013-03-08 13:59:08

相关问题