How to Access an Iteration-Counter in Java's For-Each Loop

Is there a way to access an iteration-counter in Java's for-each loop?

No, but you can provide your own counter.

The reason for this is that the for-each loop internally does not have a counter; it is based on the Iterable interface, i.e. it uses an Iterator to loop through the "collection" - which may not be a collection at all, and may in fact be something not at all based on indexes (such as a linked list).

Is there a way to go back by one iteration in a for-each loop?

It depends on what you are trying to do, but you can use a while-loop and increment the index when it's appropriate:

while(i<limit){
list.get(i);
// Do something

if(someConditionMet){
i++
}
}

Or you can use a for-loop without incrementing the index after each iteration:

for (int i = 0; i < 5; ) {
list.get(i);
// Do something

if(someConditionMet){
i++;
}
}

Also if the collection implements Iterable, you can use the iterator to iterate over the collection:

List<Integer> list;

Iterator<Integer> iterator = list.iterator();

while(someCondition){
if(someOtherContion){
Integer next = iterator.next();
}
}

Java, How do I get current index/key in for each loop

You can't, you either need to keep the index separately:

int index = 0;
for(Element song : question) {
System.out.println("Current index is: " + (index++));
}

or use a normal for loop:

for(int i = 0; i < question.length; i++) {
System.out.println("Current index is: " + i);
}

The reason is you can use the condensed for syntax to loop over any Iterable, and it's not guaranteed that the values actually have an "index"

Reference to the iteration number in Java's foreach

That's because the index is not available when using the foreach syntax. You have to use traditional iteration if you need the index:

for (int i =0; i < names.length; i++) {
String name = names[i];
}

If you do not need the index, the standard foreach will suffice:

for (String name : names) {
//...
}

EDIT: obviously you can get the index using a counter, but then you have a variable available outside the scope of the loop, which I think is undesirable

Java accessing index in for each loop

Wikipedia states:

foreach loops usually maintain no explicit counter: they essentially say "do this to everything in this set", rather than "do this x times". This avoids potential off-by-one errors and makes code simpler to read.

If you want to use index, it's better to use latter version.

if I want to access index value in first one is there any mean

Yes, you can

int index = 0;
for (int i1 : A)
{
// Your logic
// index++;
}

but again, not recommended. if you need index in Enahanced for loop, rethink your logic.

Java recommends the enahanced for loop: Source (See last line on page)

Incrementing counter in LinkedHashMap using foreach-loop

Lambda expressions can use variables defined in an outer scope
They can capture static variables, instance variables, and local variables, but only local variables must be final or effectively final

Use AtomicInteger:

AtomicInteger i = new AtomicInteger(0);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

linkedHashMap.forEach((key, value) -> {

Car car = new Car();

car.setCarId(String.valueOf(i.getAndIncrement()));
car.setCarName(entry.getKey());
car.setOdometerReading(entry.getValue());

appRoomRepository.insertCarDetails(car);

});
}

```

Is there a way to count iterations using a while loop?

Just added a counter variable to track the loop execution count.

package main;
public class Main {
public static void main(String[] args) {
for (int counter=2; counter<=40; counter+=2) {
System.out.println(counter);
}
System.out.println("For loop complete.");

int counter = 1;
int loopExecCounter = 0;
while (counter <= 500) {
loopExecCounter = loopExecCounter + 1;
System.out.println(counter);
counter++;
}
System.out.print(loopExecCounter);
}
}

Hope this helps!

How does the Java 'for each' loop work?

for (Iterator<String> i = someIterable.iterator(); i.hasNext();) {
String item = i.next();
System.out.println(item);
}

Note that if you need to use i.remove(); in your loop, or access the actual iterator in some way, you cannot use the for ( : ) idiom, since the actual iterator is merely inferred.

As was noted by Denis Bueno, this code works for any object that implements the Iterable interface.

Also, if the right-hand side of the for (:) idiom is an array rather than an Iterable object, the internal code uses an int index counter and checks against array.length instead. See the Java Language Specification.

Using a Java For-Each Loop to iterate over an ArrayList which has private access?

Inside Kennel Class make a getter function

import java.util.ArrayList;
public class Kennel{
private ArrayList<Labradors> labs;

public Kennel() {
labs = new ArrayList<Labradors>();
}

public void addDog(Labradors l) {
labs.add(l);
}

public ArrayList<Labradors> getLabs(){
return this.labs;
}
}

Then access from main function like this

class Show
{
public static void main(String args[])
{
Labradors Dave = new Labradors("Dave", "Good dog!");
Labradors Bob = new Labradors("Bob", "Likes tummy rubs!");
Kennel niceHome = new Kennel();
niceHome.addDog(Dave);
niceHome.addDog(Bob);

for (Labradors lab: niceHome.getLabs()) {
System.out.println(lab.getName());
}
}
}


Related Topics



Leave a reply



Submit