поведение for-each цикла

Ответить
Idol
Сообщения: 55
Зарегистрирован: 26 июн 2013, 04:33

поведение for-each цикла

Сообщение Idol » 12 июл 2013, 05:14

Обнаружил странное поведение (на мой взгляд) цикла for-each. Объясните, пожалуйста, где я накосячил.

Код: Выделить всё

for (Integer i : arr_posN) {
			Log.d(TAG, "arr_posN ("+ Integer.toString(i) + "): " + Integer.toString(Integer.valueOf(arr_posN.get(i))));
		if(arr_posN.get(i) == (position + 1)){
			start_id = i;
	Log.d(TAG, "start_id: " + Integer.toString(start_id));
			break;
		}
	}
Нахожу в логах:

Код: Выделить всё

 itemClick: position = 4, id = 53
 arr_posN (1): 2
 arr_posN (2): 3
 arr_posN (3): 4
 arr_posN (4): 2
 arr_posN (2): 3
 arr_posN (3): 4
 arr_posN (4): 2
 arr_posN (5): 3
 arr_posN (6): 4
 arr_posN (5): 3
 arr_posN (6): 4
 arr_posN (5): 3
 arr_posN (6): 4
Это конечно выдернуто из контекста, но если код заменить на:

Код: Выделить всё

	for (int i = 0; i < arr_posN.size(); i++) {
				Log.d(TAG, "arr_posN ("+ Integer.toString(i) + "): " + Integer.toString(Integer.valueOf(arr_posN.get(i))));
			if(arr_posN.get(i) == (position + 1)){
				start_id = i;
		Log.d(TAG, "start_id: " + Integer.toString(start_id));
				break;
			}
		}
то результат, как и задумывалось:

Код: Выделить всё

itemClick: position = 4, id = 53
 arr_posN (0): 1
 arr_posN (1): 2
 arr_posN (2): 3
 arr_posN (3): 4
 arr_posN (4): 2
 arr_posN (5): 3
 arr_posN (6): 4
 arr_posN (7): 5
 start_id: 7
т.е. почему for-each цикл прерывает итерацию на 4 элементе и начинает сначала, а потом тоже самое на 6м?

xr0m
Сообщения: 131
Зарегистрирован: 06 апр 2013, 14:01

Re: поведение for-each цикла

Сообщение xr0m » 12 июл 2013, 09:55

Потому что ты не верно используешь foreach.

for (Integer i : arr_posN) {
где i - это не ключ, а объект!

Особо код не смотрел, будет как то так:
if(i == (position + 1)){

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: поведение for-each цикла

Сообщение Mikhail_dev » 12 июл 2013, 11:38

xr0m всё верно написал. Я лишь добавлю, что это итератор. Т.е. так использовать цикл, как в епрвом примере, это значит использовать итератор Джавы. Почитайте про него, это нужная информация

Ответить