2012-03-09 9 views
4

私のアプリケーションには、いくつかのキューとプライオリティキューがあります。これらのキュー内のn番目のアイテムに簡単にアクセスしたいが、APIを使用して簡単に行う方法は見当たらない。私はイテレータを作成してn番目に反復するか、toArray()[index]を使うことができると思いますが、より簡単な方法があるはずです。Javaでキュー内のn番目のアイテムを取得するにはどうすればよいですか?

何か不足していますか?

+0

ArrayListをスタックとして使用します。特定の項目が必要なときは、get(x)を使うことができます。 –

+1

キューのアイデアに逆らっていませんか?キューは、FIFO構造であると考えられ、マップやアレイのようなオンデマンドアクセスではありません。リストのようなものに対してキューを使用している理由はありますか? – dardo

+0

'Queue'インターフェースは要素への直接的な要素アクセスを前面に限定し、イテレータを介してアクセスするだけです。あなたのために、おそらく 'List'ベースのコレクションが必要です。 – birryree

答えて

16

何か不足していますか?

はい - インデックスによる要素へのアクセスがキューの概念の一部ではないという事実。

インデックスで要素にアクセスする必要がある場合は、qeueではなくリストが必要です。

2

キューの全ポイントは、先頭(最初の要素)へのアクセスのみを公開することです。リニアデータ構造の要素に任意にアクセスするには、Listを使用します(プッシュ/ポップよりも多くの検索を行う場合は、がランダムアクセスに最適化されていないため、ArrayListを使用することを検討してください)。

+0

'LinkedList'は' Queue'、 'ArrayList'を実装していません。 –

+0

@his:私の答えのポイントは、ランダムアクセスをサポートしていないのでキューADTを使用すべきではありませんでしたが、Listを使用する必要があります(両方とも実装しています)。だから私は妥当性を見ない。 –

2

最も簡単な解決策は、binary search treeというセルフバランシングを使用することです。 AVL tree, splay tree or red-black treeO(log n)時間内のキーで要素にアクセスし、オブジェクトを順番に反復することができます。O(log n + k)ここで、kは反復される要素の数です。

+4

これらのオプションのいずれかは、過剰IMOです。 – aglassman

+1

配列ベースのキューまたはリストはあなたにO(1)を与えます。そしてそれは非常に速いO(1)です。 – yshavit

1

私はあなたがQueuesのために使用されている具体的などのようなデータ型

私のアプリケーションでは、キューと優先度キューの数を持っていますか? A LinkedList?この場合、n番目の要素をリンクリストにキャストして戻すことができます。

しかし、これはあなたがあなたがまた、正しいデータ構造を使用していないようだ質問からあなたは、プライオリティキューについてはQueue

を使用する方法ではありません。

優先度キューは常に最小要素(順序付けによって)を返します。
nここの要素はどういう意味ですか?nが最小か、nが挿入されていますか?したがって、実際にこの場合に何をすべきかを言うことはできません。

+0

'LinkedList'のn番目の要素を取得することは、' Queue'を介してn番目の要素に反復処理するのと同じことに注意してください。 –

+0

@ MarkPeters:あなたは正しいですが、これは 'Queue'の適切な使用ではなく、コードでこれを見るのは厄介です。あなたがより良くしようとしていることを反映しているため、直接 'LinkedList'として扱います。 – Cratylus

+0

@user:' List'を使う方が良いですが、 'Queue'を反復することは* casting * 'LinkedList'は自分自身を実装の詳細に結びつけているからです。 OPに「Queue」を提供するコードを変更する機能がある場合は、私は完全に同意します。 –

1

キューは概念によってインデックス化されたランダムアクセスを許可していません。両方の種類のアクセスが同時に必要な場合(設計上の悪影響)、ListQueue(たとえばLinkedList)の両方を実装するデータ型を使用できます。

関連する問題