Есть ли способ разделить для цикла в Java, чтобы сделать разные вещи для значений? - PullRequest
1 голос
/ 09 мая 2019

Вопрос для начинающих: есть ли способ разделения цикла в Java? например ниже, я хотел бы разделить

    for(int i=0; i<bucket.size(); i++){
        do something 
    }

скажем, bucket.size = 10 Разделить на две части.

  1. сделать что-то для первых 9 значений в сегменте

  2. сделать что-то для последнего значения в корзине

Ответы [ 7 ]

3 голосов
/ 09 мая 2019

Наиболее напрямую:

for(int i=0; i<bucket.size()-1; ++i){
    do something 
}
do something else

Использование List.sublist

for (Buck buck : bucket.subList(0, bucket.size()-1)) {
    do something
}
// (Might want to check exists...)
Buck buck = bucket.get(bucket.size()-1);
do something else
1 голос
/ 09 мая 2019

Я бы использовал цикл while

int i = 0; 
while(i < (bucket.size() - 1))
{
    //do first nine
    i++;
}
//do last one
1 голос
/ 09 мая 2019

Если вы используете LinkedList, вы можете вызвать removeLast метод, который удаляет и возвращает последний элемент.

LinkedList<Integer> bucket= new LinkedList<>();
int last = bucket.removeLast();

// do something with the last item here

for (Integer i : bucket) {
// Do something for all items except the last one            
}
1 голос
/ 09 мая 2019
for (int i=0; i<bucket.size()-1; i++){
    if (i < 9)
    {
    //DO
    } 
    else if (i == bucket.size()-2) 
    //-2 because the loop condition is < not <= but also includes a -1
    //Only works with bucket size 11 or greater or it will just enter the i< 9 instead
    {
    //DO for final time in loop
    } 
}

Просто используйте некоторые условия if внутри блока, чтобы найти то, что вам нужно.

Вы можете использовать && для AND, || для ИЛИ, а затем, конечно, < > <= >= ==

Ваш цикл будет выполняться только 9 раз, хотя, поскольку он у вас

    int size = 10;
    for (int i=0; i<=size-1; i++){

    }

Если вы хотите, чтобы цикл выполнялся 10 раз.

0 голосов
/ 09 мая 2019

Вы можете воспользоваться skip и limit методами из Stream

 //first 9 elements
 bucket.stream().limit(9).forEach(s -> {
        //do smth
 });

 //remaining elements
 bucket.stream().skip(9).forEach(s -> {
        //do smth
 });
0 голосов
/ 09 мая 2019

Ну, есть много способов для этого. Если вы намереваетесь просто сделать something else с последним элементом и something с остальными, я думаю, вы должны сделать что-то вроде этого:

    int lastIndex = bucket.size() - 1;
    for (int i = 0; i < lastIndex; i++) {
        Type item = bucket.get(i);
        //do something with item
    }
    if(lastIndex != -1) {
        Type item = bucket.get(lastIndex);
        // do something else with item
    }

Таким образом, вы избегаете сравнения каждый раз и сохраняете одну итерацию (не большое преимущество, я знаю).

Хотя, если ваш список действительно большой и вам нужен эффективный способ, или даже ваш вариант использования более сложный, вам следует рассмотреть возможность использования Spliterators:

https://www.baeldung.com/java-spliterator

0 голосов
/ 09 мая 2019

Если вы хотите сделать что-то только для последнего значения, просто сделайте это. Это предполагает непустой список, как указано в OP.

  // Doing something for first size-1 values.
  for(int i=0; i<bucket.size()-1; i++){
      //  do something with
      bucket.get(i);
  }
  // Now do something with last value.
  bucket.get(bucket.size()-1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...