Улучшено для l oop Java, чтобы работать до указанного c индекса? - PullRequest
1 голос
/ 09 февраля 2020

Я учусь, как использовать расширенный цикл. Представьте себе массив размером 1000, называемый обр. Запись

for(T x: arr) { /* blah blah */ }

будет проходить через весь массив. Я знаю, что могу сломать l oop, используя break; внутри тела l oop.

Есть ли способ остановить выполнение l oop при определенном значении индекса?

Можно ли написать это?

for (T x: arr[500]) {/* blah blah */}

Чтобы я мог избежать использования счетчика?

Ответы [ 6 ]

2 голосов
/ 09 февраля 2020

Короче говоря: нет. Для этого вы должны использовать «обычный» for l oop:

for (int i = 0; i < someCondition; i++) {
  if (i < someNumber) {
    break;
  }
}
0 голосов
/ 09 февраля 2020

Я думаю, вы ищете синтаксический способ сделать это, а не обходной путь для достижения этого эффекта. Если я прав, то - Нет, нет способа указать индекс нарушения в расширенном для l oop, и это одна из идей, почему существуют расширенные для циклов - просто сказать компилятору перебирать все объекты в последовательной манере. С тем, что вы просите, вы фактически побеждаете одну из целей улучшенного для l oop, если вы хотите разбить ее по заданному c индексу.

Причина этого в том, что внутреннее расширение для циклов принимает объект итератора и выполняет итерацию по коллекции до тех пор, пока итератор не получит следующий элемент.

0 голосов
/ 09 февраля 2020

Вы можете использовать это вместо своего кода

for(var i=0;i<500;i++){
T x=arr[i];
 //your code

}
0 голосов
/ 09 февраля 2020

Если вы хотите, чтобы ваш расширенный l oop остановился на определенном значении индекса, вы должны следить за индексом самостоятельно. Вы можете сделать что-то вроде ниже:

    int index = 0;
    for(T x: arr) {
        if(index==10) {
            break();   
        }

        //do whatever you want to do here before index value becomes 10.        
        index++;

    }

Вы можете использовать другие подходы, но это самый простой способ сделать это.

0 голосов
/ 09 февраля 2020

Если вы используете java 8+, вы можете сделать то же самое, используя подмассив исходного массива

int[] subarray = IntStream.range(0, 500)
                        .map(i -> src[i])
                        .toArray();
//then do 
for (T x: subarray) {/* blah blah */}

Или вы можете использовать лямбда-потоки для достижения того же:

Arrays.stream(arr).limit(500).foreach(x -> {/* blah blah */});

0 голосов
/ 09 февраля 2020

Вы можете сделать следующее, но в этом случае предпочтительнее использовать условную l oop.

for(T x: Arrays.copyOfRange(arr, 0, 500)) {}
...