2

未知の型 T を持つ反復可能なオブジェクト型を取得し、そこから項目を取り出して別のデータ構造に入れるメソッドをループします。ソートされた順序でアイテムを再度追加できるように、古いイテラブル オブジェクトから各アイテムを削除する必要があります。

ループ後にオブジェクトで使用しようとし.clear()ましたが、明確なメソッドがあるとは限りません。では、どうすればアイテムを削除できますか、または、まったく同じタイプで値のない新しいオブジェクトを作成して、オブジェクトがIterable.

public class PriorityQueue<K extends Comparable<? super K>,V> {

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

      for (K item : list) {
          queue.insert(item, null);
      }

      list.clear();
  }
}
4

3 に答える 3

3

for-each ループを使用する代わりに、明示的なIteratorオブジェクトと を使用しIterator.remove()ます。

    Iterator<K> iter = list.iterator();
    while (iter.hasNext()) {
        K item = iter.next();
        queue.insert(item, null);
        iter.remove();
    }

すべてのIterator実装がオブジェクトの削除をサポートしているわけではないことに注意してください (たとえば、読み取り専用コレクションはサポートしていません)。

于 2013-03-08T14:37:48.217 に答える
1

リストをウォークスルーするには、 Iteratorを使用する必要があります。イテレータは remove メソッドをサポートしています。

于 2013-03-08T14:38:54.950 に答える
1

すべてのコレクションはイテラブルですが、その逆は当てはまりません。したがって、反復子項目を生成するデータソースから何かを削除することが常に意味があるとは期待できません。このかなり複雑な hello world の例のように:

Iterable<Character> myIterable = new Iterable<Character>() {

    @Override
    public Iterator<Character> iterator() {
        Iterator<Character> it = new Iterator<Character>() {

            private String hello = "Hello World";
            private int counter = 0;

            @Override
            public boolean hasNext() {
                return counter < hello.length();
            }

            @Override
            public Character next() {
                return hello.charAt(counter++);
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException();
            }

        };
        return it;
    }
};

for (Character c : myIterable) {
    System.out.print(c);
}

Iterable をサポートするコレクションはありません。これは単なる「反復子プロバイダー」であり、文字列しかありません (文字列から文字を削除することはできません。文字列は不変です)。

いいえ、「イテラブルをクリア」することはできず、すべてのイテレータがアイテムの削除をサポートしているわけではありません。

于 2013-03-08T14:49:08.807 に答える