3

この API 呼び出しは、ソートされていない、潜在的に大きな List<String> を返します。並べ替え、検索し、ランダムな要素にアクセスする必要があります。現在、List は ArrayList によって実装されています (ソースを確認しました) が、将来、API 開発者が LinkedList の実装に (インターフェイスを変更せずに) 切り替えることを選択する可能性があります。

潜在的に大きい LinkedList の並べ替え、検索、アクセスは非常に遅くなり、私のプログラムでは受け入れられません。したがって、リストを ArrayList に変換して、プログラムの実用的な効率を確保する必要があります。ただし、List はすでに ArrayList である可能性が高いため、List の新しい ArrayList コピーを不必要に作成するのは効率的ではありません。

これらの制約を考慮して、List を ArrayList に変換する次の方法を考え出しました。

private static <T> ArrayList<T> asArrayList(List<T> list) {
  if (list instanceof ArrayList) {
    return (ArrayList<T>) (list);
  } else {
    return new ArrayList<T>(list);
  }
}

私の質問はこれです:これは、実装が不明なリストを操作する最も効率的な方法ですか? List を ArrayList に変換するより良い方法はありますか? List を ArrayList に変換するよりも良いオプションはありますか?

4

4 に答える 4

4

あなたが持っているものよりもはるかに単純になることはできません-私にとっては可能な限り効率的に見えます.

とは言っても、これは時期尚早の最適化のように聞こえます。これについて本当に心配する必要があるのは、使用している API の作成者がLinkedList. 今それについて心配している場合、実現しないかもしれない将来のシナリオの計画に多くの時間と労力を費やす可能性があります。これは、修正する他の問題を見つけることに費やす方がよい時間です. おそらく、API のバージョンを変更するのは、独自のアプリケーションのバージョン間のみです。その時点で問題を処理してください。

于 2012-06-01T15:02:21.370 に答える
2

ご覧のとおり、コードは単純で、必要な場合にのみコピーを作成するため、効率的です。

したがって、答えは、たとえばリストをソートするなど、まったく異なるタイプのソリューションを除いて、大幅に優れたオプションはないということです。

(このレベルの最適化が必要になることはめったにないため、頻繁に発生する問題ではないことに注意してください。)

更新: 一般的なルールとして、適切に作成された API は、含まれる可能性のあるデータの量に不適切なデータ型を返しません。盲目的に信頼すべきだと言っているわけではありませんが、完全に不合理な仮定ではありません。

于 2012-06-01T15:00:18.183 に答える
1

潜在的に大きい LinkedList の並べ替え、検索、アクセスは非常に遅くなり、私のプログラムでは受け入れられません。

実際、それほど悪くはありません。IIRC の Collections.sort メソッドは、リストを一時配列にコピーし、配列clear()、元のリストを並べ替えて、配列を元のリストにコピーします。リストが十分に大きい場合は、O(NlogN)並べ替えフェーズがO(N)コピー フェーズよりも優先されます。

于 2012-06-01T15:17:43.090 に答える
0

効率的なランダム アクセスをサポートする Java コレクションは、RandomAccess マーカー インターフェイスを実装します。Collections.sortこのようなリストの場合は、リストを直接実行できます。ランダム アクセスのないリストの場合は、そのメソッドの 1 つを使用してリストを配列にダンプし、その配列をtoArray並べ替えてから、 random-access にラップする必要がありますList

T[] array = (T[])list.toArray(); // just suppress the warning if the compiler worries about unsafe cast
Arrays.sort(array);
List<T> sortedList = Arrays.asList(array);

私はArrays.asList実際に を作成すると思うArrayListので、必要に応じてその結果をキャストしてみてください。

Collections.sortList効率的なを提供する限り、すべての実装で効率的ListIteratorです。このメソッドは、リストを配列にダンプし、並べ替えてから、を使用しListIteratorて値を O(n) のリストにコピーします。

于 2012-06-01T15:17:42.640 に答える