1

如何创建在两种泛型类型上运行的可迭代泛型类?

也就是说,如果我有一个名为:

public class PriorityQueue<K,V> {}

Iterable如果我无法使用,我该如何实施implements Iterable<K,V>?Eclipse 给出错误提示:

Iterable 类型的参数数量不正确;它不能用参数参数化

我一定是误解了如何实现我自己的可迭代集合。

关于这个问题:我想让我的优先队列可迭代,还是让队列存储的条目可迭代?


编辑:

对于我的家庭作业,我必须以链表方式实现 PriorityQueue ADT。我已经实现了所有方法,除了一个 -- min()。我正在考虑这样做的方式是通过创建一个私有方法来迭代Entry存储在我的列表中的所有对象。entries()但我不知道如何解决这个问题。

我现在有一个指向链表头部的链接和一个指向尾部的链接。如何制作所述entries()方法以便我可以返回Iterable条目的对象?

这是我的Entry<K,V>对象:

public class Entry<K,V> implements Comparable {

  private V _value;
  private K _key;
  private Entry<K,V> _prev;
  private Entry<K,V> _next;

  public Entry(K key, V value) {
    this._value = value;
    this._key = key;
    this._prev = null;
    this._next = null;
  }

  public V getValue() {
    return this._value;
  }

  public K getKey() {
    return this._key;
  }

  public Entry<K,V> getNext() {
    return _next;
  }

  public void setNext(Entry<K,V> link) {
    this._next = link;
  }

  public Entry<K,V> getPrev() {
    return _prev;
  }

  public void setPrev(Entry<K,V> link) {
    this._prev = link;
  }

  @Override
  public int compareTo(Object arg0) {
    if (arg0 instanceof Entry<?,?>) {

    }
    return 0;
  }
}

这是我PriorityQueue<K,V>到目前为止:

public class PriorityQueue<K,V> implements Iterable<K>{

  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() {

  }

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

  @Override
  public Iterator<K> iterator() {
    // TODO Auto-generated method stub
    return null;
  }
}
4

2 回答 2

3

您必须为返回的 Iterable 对象使用包装类。在您的情况下,我假设它是类型条目。例如,您的代码应如下所示:

public class PriorityQueue<K, V> implements Iterable<Entry<K, V>> {
}

当然,您始终可以创建自定义包装器。

于 2013-03-07T22:14:05.270 回答
1

可迭代意味着您可以迭代其类型的对象。它接受一个类型参数。从文档中:

公共接口可迭代

实现这个接口允许一个对象成为“foreach”语句的目标。

如果您希望它在您的键上是可迭代的,您的类应该实现Iterable<K>。如果您希望它对您的值是可迭代的,您的类应该实现 Iterable<V>

这是一篇关于实现 Iterable的博客文章。

通常,您想让队列存储的条目可迭代,您可能还想弄清楚按什么顺序排列。

如果您正在徘徊实现优先队列,您可能还想看看 Java 自己的PriorityQueue实现并遵循它。

于 2013-03-07T22:03:10.057 回答