Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java - Turning the for-loop counter back based on a conditional

The following is part of the code for my college assignment.

else if (!codeList.contains(userCode)) {
                    i--; // i is the counter for the for-loop
                }
else if (userQuantity[i]==0) {
                    i--;
                }

The first part makes sure that if the user enters the wrong code, the counter i does not increment 1, or rather, it subtracts 1 from the recently incremented counter. This part works fine.

The second part however is what I seem to be having problems with. userQuantity[] is an int array and it has to be an array. This does not seem to do anything to the code. Even if 0 is entered for the quantity, it still incrememnts the counter which is not desireable.

I should explain, to avoid confusion, that this is an infinite for-loop (with a break statement). The reason I am doing a for-loop is because I am required to. Is it because of my for-loop that the condition isn't working or am I doing something completely wrong with it?

This is for my college assignment so I would appreciate answers with explanation and not just quick-fixes. If you need me to explain, let me know please.

like image 403
Nico Avatar asked Jan 26 '12 00:01

Nico


3 Answers

Although it's not strictly illegal in Java, it's not a good idea to change the value of the for loop control variable from within the loop. (Such modification is illegal in some other languages.)

By changing the loop iteration variable within the loop, you're messing with the implicit assumptions offered by your use of a for loop. For example, if a reader sees:

for (int i = 0; i < 10; i++) {
    // ...
}

the reader will rightfully assume that the loop is intended to execute exactly 10 times (or, no more than 10 if there is a break in there). However, if you go changing the value of i within the loop, this assumption is no longer valid.

If you must change the value of the counter, I would suggest writing this as a while loop instead:

int i = 0;
while (i < 10) {
    // ...
    i++;
}

along with a comment that explains why you are changing i within the loop and what it means to do so.

like image 87
Greg Hewgill Avatar answered Oct 18 '22 02:10

Greg Hewgill


This is very bad practice. Change the for loop to a while loop and only increment if

 codeList.contains(userCode)==true or userQuantity[i]!=0. 
like image 23
ghostbust555 Avatar answered Oct 18 '22 01:10

ghostbust555


I should explain, to avoid confusion, that this is an infinite for-loop (with a break statement). The reason I am doing a for-loop is because I am required to. Is it because of my for-loop that the condition isn't working or am I doing something completely wrong with it?

I have a feeling that you are misunderstanding the requirements (e.g. you are not required to use a for loop), or that there is a mistake in your thinking; i.e. there is a simpler solution that doesn't involve the counter going backwards.

(It is surprising that a programming exercise would require you to write code that most experienced Java programmers would agree is bad code. The simple explanation is that it is not.)

Either way:

  • Changing the loop variable in a for loop is bad practice, for the reasons described by Greg.

  • The idea of an "infinite for loop" is really strange. The following is legal Java ...

    for (int i = 0; true; i++) {
        ...
    }
    

    but the idiomatic way to write it is:

    int i = 0;
    while (true) {
        ...
        i++; // ... at the appropriate point / points
    }
    

    ... which in most cases means that you don't need to make the variable go backwards at all.

like image 1
Stephen C Avatar answered Oct 18 '22 01:10

Stephen C