Страница 1 из 1

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

Добавлено: 12 июл 2013, 05:14
Idol
Обнаружил странное поведение (на мой взгляд) цикла 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м?

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

Добавлено: 12 июл 2013, 09:55
xr0m
Потому что ты не верно используешь foreach.

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

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

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

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