私は非常に頻繁に1つのリストを返す必要があるソフトウェアに取り組んでいます。このリストは、他の多くのリストの最初の(N個までの)要素から構成されています。リターンはクライアントによって変更されません。読み取り専用です。 Iドンとして複数のサブリストにわたるビューである実装をリストしますか?
List ret = new ArrayList<String>();
for (List aList : lists) {
// add the first N elements, if they exist
ret.addAll(aList.subList(0, Math.min(aList.size(), MAXMATCHESPERLIST)));
if (ret.size() >= MAXMATCHESTOTAL) {
break;
}
}
return ret;
私は新しいリストの作成とのaddAll(の使用を避けるしたいと思います):
現在、私は(読みやすくするために簡略化されたコード)の線に沿って何かをやっています新しいリストを返す必要がなく、毎秒何千もの要素を扱っています。この方法は、私のアプリケーションの大きなボトルネックです。
私が探しているのは、含まれている各リストのsubList()結果(安価なビューであり、実際のコピーではない)で構成されているListの実装です。
私はjava.util、Commons Collections、Commons Langなどの通常の容疑者を見てきましたが、私の人生ではそのような実装を見つけることはできません。私はそれがある時点で実装されていなければならないと確信していますし、うまくいけば私は明らかな何かを逃した。
だから私はあなたに目を向ける、スタックオーバーフロー - そのような実装を知っている人は誰ですか?私は自分自身を書くことができますが、ホイールが外に出ればホイールを再発明するのは嫌です。
代わりの効率的なアプローチの提案は大歓迎です!
オプションの背景の詳細(私の質問に関連するすべてではないかもしれませんが、私がしようとしていることを理解するのに役立ちます):これはクロスワードスタイルのグリッドにテーマの周りを回る。各テーマは、テーマの関連性の高い順に並べられた任意の数の候補単語リストを有することができる。例えば、「映画」のテーマは、映画のタイトルのリスト、次に俳優のリスト、映画関連の可能性があるまたはそうでない可能性のある場所の一般的なリスト、次いで英語の一般的なリストから始めることができる。リストはそれぞれ、ワイルドカード付きトライ構造に格納されており、グリッド制約を満たす高速検索が可能です(たとえば、 "CAT"はキー "CAT"、 "CA?"、 "C ??" "?AT"、... "???"など)リストは、数語から数万語までさまざまです。任意のクエリについて、例えば、。 "C ??"、ソースリストと同じ順序で並べられたN個(50語)の一致する単語を含むリストを返したいとします。リスト1に「C ??」の3つの一致が含まれている場合、リスト2には7が含まれ、リスト3には100が含まれています。リスト1の3つの一致を最初に含む戻りリストが必要です。そして、私は返された "結合リストビュー"操作が、subList()の実装と同様の方法でaddAll()を継続的に呼び出すよりも効率的であることを望みます。
返されたリストをキャッシュすることは、メモリの制約のためにオプションではありません。私のトライは、すでに(32ビットの)最大サイズのヒープの大部分を消費しています。
PSこれは宿題ではなく、実際のプロジェクト用です。どんな助けも大変ありがとう!
質問は宿題のノートブックからコピー貼り付けされているようです。 –
@saugok - 私はそれは知っていますが、私を信じています。私は15年前に大学を卒業しました。ジャーナルのためのニューヨークタイムズスタイルのクロスワードパズルをテーマにしたプロジェクトを作成するプロジェクトです。私のソフトウェアは動作していますが、それはできるだけ遅いです。 – jkraybill