1

配列リストを配列に変換するコードは次のとおりです。

private String[] arrayLst_to_array(ArrayList<String> al) {
    String[] arr = new String[al.size()];
    arr = al.toArray(arr);
    return arr;
}

しかし、新しい配列の最初に特定の文字列が必要であり、その後、残りの配列リストが必要です。

必要な文字列をarraylistの先頭に追加してから変換できることはわかっていますが、もっと効率的な方法はありますか?

4

4 に答える 4

7

使用できますSystem.arraycopy()

String[] arr = new String[al.size() + 1];
arr[0] = someStr;  // initial string

// copy the list:
System.arraycopy(al.toArray(), 0, arr, 1, al.size());

return arr;
于 2013-10-02T14:53:41.353 に答える
1

リストの先頭に項目を追加すると、リスト全体の内容を 1 つ上に移動する必要があります。これは、操作全体で各要素が 2 回タッチされることを意味します。リストを配列にエクスポートしてSystem.arrayCopyから、最初に 1 つの領域を確保するために使用すると、再び各項目が 2 回処理されます。

各項目に一度だけ触れる最も簡単な解決策は、配列を作成し、文字列を追加してから、リストを繰り返し処理してその要素を追加することです。

String[] arr = new String[al.size() + 1];
arr[0] = someStr;
int i=1;
for (String s: al) {
    arr[i++] = s;
}

これがアイテムを 2 回反復するアプローチよりも高速であるが、効率の恩恵を受けるかどうかは、System.arrayCopyベンチマークによって示される必要があります。

于 2013-10-02T15:03:21.493 に答える
1

メモリ効率は良いが、あまりパフォーマンスが良くないソリューションは次のとおりです。

public static String[] listPlusOne(final ArrayList<String> list, final String prepend)
{
    final String[] arr = list.toArray(new String[list.size() + 1]);
    System.arraycopy(arr, 0, arr, 1, list.size());
    arr[0] = prepend;
    return arr;
}

Stringこのソリューションでは、配列を1 つだけ割り当てSystem.arrayCopy()、すべての要素を 1 つ上の位置に移動するために を使用してメモリ移動を実行します。

一般的に言えば、メモリの移動は常に最善の解決策ではありません。ALinkedListは非常に迅速な要素のプリペンドを許可しますが、ランダムな位置で要素にアクセスする場合、O(n) の複雑さがあります。はArrayList、前置 (メモリの移動、再割り当て) では遅くなりますが、要素にアクセスするときは O(1) になります。

したがって、上記のコードのようなものを使用するか、要素をリストの先頭に追加します。

于 2013-10-02T14:59:56.683 に答える
-2

あなたの質問への短い答えはいいえです。あなたが与えたオプションは、それを行うための最良の方法だと思います。

于 2013-10-02T14:53:10.067 に答える