如何创建一个可在两种泛型类型上运行的可迭代泛型类?
也就是说,如果我有一个叫做的课程:
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;
}
}
答案 0 :(得分:3)
您必须为返回的Iterable对象使用包装类。在你的情况下,我假设它是类型Entry。例如,您的代码应如下所示:
public class PriorityQueue<K, V> implements Iterable<Entry<K, V>> {
}
当然,您始终可以创建自定义包装器。
答案 1 :(得分:1)
Iterable意味着您可以迭代其类型的对象。它接受一个类型参数。 来自文档:
public interface Iterable
实现此接口允许对象成为“foreach”语句的目标。
如果您希望它可以在您的密钥上使用,那么您的课程应该实现Iterable<K>
。
如果您希望它对您的值有效,那么您的课程应该实现Iterable<V>
。
这是关于实现Iterable的blog post。
通常,您希望使队列存储的条目可迭代,您也可能想知道它的顺序。
如果您正在徘徊实现优先级队列,您可能还想看看Java自己的PriorityQueue实现并遵循它。