Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enhanced for loop starting part way through List

Im a beginner in Java and I had this doubt. Is it possible to use the Enhanced for loop in Java on an ArrayList, but start at the specified point rather than ArrayList[0].

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

Can I use enhanced for loop and start iterating from calc[2] rather than calc[0]?? If possible, how can I do that? In my particular case, using a enhanced for loop would be better, rather than a normal for loop.

like image 354
user2358330 Avatar asked Jun 25 '13 16:06

user2358330


1 Answers

The best way in Java would be like this:

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

subList is an efficient view of the original list, so it's almost exactly what you need.

UPDATE

OK, motivated by Mikera's comments, I benchmarked it on jmh. This is the benchmarked code:

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;
  }
}

And these are the results:

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

Conclusions:

  1. enhanced for on the main list is as fast as indexed iteration, once past the initialization cost;

  2. traversal of the sublist is somewhat slower than of the main list, and iteration is somewhat slower than indexed traversal;

  3. all the differences are negligible for all practical purposes.

like image 87
Marko Topolnik Avatar answered Nov 08 '22 08:11

Marko Topolnik