7

私はJavaの初心者で、この疑問がありました。ArrayList で Java の拡張 for ループを使用することは可能ですが、ArrayList[0] ではなく指定されたポイントから開始します。

For eg. ArrayList<Integer> calc = new ArrayList<Integer>;
       // calc contains {0,1,2,3,4,5,6,7}

強化された for ループを使用して、calc[0] ではなく calc[2] から繰り返しを開始できますか?? 可能であれば、どうすればそれを行うことができますか? 私の特定のケースでは、通常の for ループよりも強化された for ループを使用する方が良いでしょう。

4

5 に答える 5

18

Java での最善の方法は次のようになります。

for (Integer i : calc.subList(start, calc.size()) {
  ... 
}

subListは、元のリストの効率的なビューであるため、ほぼ正確に必要なものです。

アップデート

わかりました、ミケラのコメントに動機付けられて、私はそれをベンチマークしましたjmh. これはベンチマーク コードです。

import org.openjdk.jmh.annotations.GenerateMicroBenchmark;

public class Benchmark1
{
  static final List<Integer> list = new ArrayList(asList(1,2,3,4,5,6,7,8,9,10));
  static { for (int i = 0; i < 5; i++) list.addAll(list); }

  @GenerateMicroBenchmark
  public long testIterator() {
    long sum = 0;
    for (int i : list) sum += i;
    return sum;
  }
  @GenerateMicroBenchmark
  public long testIndexed() {
    long sum = 0;
    for (int i = 0; i < list.size(); i++) sum += list.get(i);
    return sum;
  }
  @GenerateMicroBenchmark
  public long testSublistIterator() {
    long sum = 0;
    for (int i : list.subList(1, list.size())) sum += i;
    return sum;
  }
  @GenerateMicroBenchmark
  public long testIndexedSublist() {
    long sum = 0;
    final List<Integer> l = list.subList(1, list.size());
    for (int i = 0; i < l.size(); i++) sum += l.get(i);
    return sum;
  }
}

そして、これらは結果です:

Benchmark        ops/msec
-------------------------
Indexed          1860.982
IndexedSublist   1642.059
Iterator         1818.657
SublistIterator  1496.994

結論:

  1. メイン リストの拡張は、初期化コストを超えると、インデックス付き反復と同じくらい高速です。

  2. サブリストのトラバーサルはメイン リストのトラバーサルよりもやや遅く、反復はインデックス付きトラバーサルよりもやや遅くなります。

  3. すべての実用的な目的において、すべての違いは無視できます。

于 2013-06-25T16:06:06.280 に答える
1

以下のように、 sublistを反復処理できます。

for (Integer integerMember : calc.subList(2, calc.size()) {
    // operation here
}
于 2013-06-25T16:07:49.027 に答える
0

ArrayList強化された for ループは、標準のインデックス作成では効率が悪いことに注意してください。これは、ループの各ステップでオブジェクトを作成して and を呼び出す必要があり、不要なオーバーヘッドが発生するためですIteratorhasNextnext

sublistこのため、このアプローチを使用するのではなく、従来の方法でインデックスを作成することをお勧めします。

于 2013-06-25T16:34:50.017 に答える