1

2 つのジェネリック型で実行される反復可能なジェネリック クラスを作成するにはどうすればよいですか?

つまり、次のクラスがあるとします。

public class PriorityQueue<K,V> {}

Iterable使用できない場合、どのように実装できますimplements Iterable<K,V>か? Eclipseは次のようなエラーを出しています:

タイプ Iterable の引数の数が正しくありません。引数でパラメータ化することはできません

独自の反復可能なコレクションを実装する方法を誤解しているに違いありません。

そして、この主題について: プライオリティキューを反復可能にしたいですか、それともキューが格納するエントリを反復可能にしますか?


編集:

宿題のために、PriorityQueue ADT をリンク リスト形式で実装する必要があります。私はすべてのメソッドを実装しました.1つだけ保存し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 オブジェクトにはラッパー クラスを使用する必要があります。あなたの場合、それはタイプ Entry であると想定しています。例として、コードは次のようになります。

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

もちろん、いつでもカスタム ラッパーを作成できます。

于 2013-03-07T22:14:05.270 に答える
1

Iterableは、そのタイプのオブジェクトを反復処理できることを意味します。1つのタイプパラメータを受け入れます。ドキュメントから:

パブリックインターフェイス反復可能

このインターフェースを実装すると、オブジェクトを「foreach」ステートメントのターゲットにすることができます。

キーに対して反復可能にする場合は、クラスで実装する必要がありますIterable<K>。値に対して反復可能にしたい場合は、クラスで実装する必要があります Iterable<V>

Iterableの実装に関するブログ投稿は次のとおりです。

通常、キューに格納されているエントリを反復可能にしたい場合は、順序を把握することもできます。

優先度付きキューの実装について迷っている場合は、Java独自の優先度付きキューの実装を確認してそれに従うこともできます。

于 2013-03-07T22:03:10.057 に答える