0

これは簡単かもしれませんが、4 つの for ループ (null 要素をカウントして削除するために 2 つ、要素を追加するために 2 つ) を使用するか、2 つの文字列配列をマージするか、ArrayList で 2 つの for ループを使用するかを決定する必要がある状況があります。 ArrayList.toArray() を使用して ArrayList を配列に変換します。

パフォーマンスに関して、これら 2 つのアプローチに違いはありますか?

編集

互換性の問題のため、ジェネリック アプローチで ArrayList を削除する必要がありました。しかし、ここに以前のコードがあります。

List<String> newList = new ArrayList<String>();

    for (String element : array1)
    {
      if (element != null)
      {
        newList.add(element);
      }
    }

    for (String element : array2)
    {
      if (element != null)
      {
        newList.add(element);
      }
    }

    return newList.toArray(new String[]{});

1回のループで新しいコードを書きましたが、このコードを読んでいる次の人を精神的に殺しているのではないかと思います。

String[] newArr = new String[array1.length + array2.length];
int n = 0;

for (int i = 0; i < newArr.length; i++)
{
  if (i < array1.length && array1[i] != null)
  {
    newArr[n] = array1[i];
    n++;
  }

  if (i >= array1.length)
  {
    int a = 0;
    if (array1.length < array2.length)
    {
      a = (i - array1.length) + (array2.length - array1.length);
    }
    else
    {
      a = i - array1.length;
    }

    if (array2[a] != null)
    {
      newArr[n] = array2[a];
      n++;
    }
  }
}

return newArr;

最後に、null 要素のチェックが必要ないことがわかったので、この単純なコードに進みました。

String[] newArr = new String[array1.length + array2.length];

    System.arraycopy(array1, 0, newArr, 0, array1.length);
    System.arraycopy(array2, 0, newArr, array1.length, array2.length);

    return newArr;

以下の議論から、2番目の方法の方がパフォーマンスが優れていると思います。

4

3 に答える 3

3

1 つの for ループの時間計算量が O(n) であると仮定すると、4 つの for ループと 2 つの for ループの時間計算量は同じになります。

4*O(n) = O(n)
2*O(n) = O(n)

ただし、ArrayList の代わりに配列を使用すると、必要なメモリが少なくなります。したがって、最初の選択肢を使用してください。

于 2013-10-16T12:37:49.270 に答える
0

2番目のオプションと同様に、コレクションの2回の繰り返しが保存されます。これにより、リスト内のオブジェクトの数が多い場合、パフォーマンスが確実に向上します。

于 2013-10-16T12:37:08.457 に答える