(Java) Проверка массива на предмет увеличения элементов - PullRequest
2 голосов
/ 22 августа 2011

Я пытаюсь создать метод, который проверяет массив на предмет увеличения элементов. Значение true должно быть возвращено, если все элементы расположены в порядке возрастания. Я получаю исключение за пределами границ при сравнении arr [i + 1]. Любые идеи о том, как я могу заставить это работать.

int[] one = {1,2,3,4,5};

public static boolean isIncreasing(int[]arr)
{
    boolean z = false;

    for(int i=0; i<arr.length;i++)
    {

        if(arr[i]<arr[i+1])
            {
                z = true;
            }
    }

    return z;
}

Ответы [ 5 ]

4 голосов
/ 22 августа 2011

У вас есть две проблемы:

  1. Ваш цикл на одну итерацию слишком длинный: поскольку вы проверяете элемент i+1, мне нужно завершить приращение на одну итерацию раньше обычного цикла.
  2. Твоя логика ошибочна. Ваш цикл завершит в первый раз проверка верна, поэтому этот массив будет проходить: {1, 2, 0} при проверке первой итерации проверяет 1 < 2, что верно, поэтому возвращает true - это не то, что нам нужно )

Исправление этих двух проблем:

int[] one = {1,2,3,4,5};

public static boolean isIncreasing(int[] arr) {
    for(int i=0 ; i < arr.length - 1; i++) { // finish at length - 1
        if (arr[i] > arr[i+1]) {
            return false; // found elements that are out of order - return false
        }
    }    
    return true; // nothing out of order found - return true
}

Этот вид логики - с ранним выходом из положения «ложь в задаче» и окончательным возвращением «истины» - очень распространен и является хорошим примером для изучения.

4 голосов
/ 22 августа 2011

Поскольку в списке с n элементами есть только n-1 промежутки между ними.

Изменить на

for (int i=0; i<arr.length-1; i++)

(Также вы можете проверить, правильно ли начинать с false и установить true).

2 голосов
/ 22 августа 2011

Я предлагаю вам написать свой метод следующим образом:

public static boolean isIncreasing(int[]arr)
{
    for(int i=1; i<arr.length;i++)
    {
        if(arr[i-1]>arr[i])
            return false;
    }
    return true;
 }

это поможет

  • вернуть правильный результат (ваш вернет true, если это не так)
  • считать за пределами
  • избегать ненужных циклов
1 голос
/ 13 апреля 2015

Вы можете использовать IntStream в Java 8.

import java.util.stream.IntStream;

public class Test {
  public static boolean isIncreasing(int[] a) {
    return IntStream.range(1, a.length).reduce(0, (acc, e) -> acc + (a[e - 1] <= a[e] ? 0 : 1)) == 0;
  }
}
1 голос
/ 22 августа 2011

Вы получаете это исключение, когда значение (i + 1) становится array.length. Например, если у вас есть массив длины 10, индексы элементов будут от 0,1,2 ... до 9. Поэтому вы должны либо проверить до i < arr.length - 1, либо вы можете соответствующим образом изменить свою логику.

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