Sprawdź, czy tablica jest posortowana, zwróć wartość true lub false


Piszę prosty program, który po prostu zwraca wartość true, jeśli tablica jest posortowana, w przeciwnym razie jest fałszywa i ciągle otrzymuję wyjątek w zaćmieniu i po prostu nie mogę zrozumieć, dlaczego. Zastanawiałem się, czy ktoś mógłby rzucić okiem na mój kod i w pewnym sensie wyjaśnić, dlaczego otrzymuję wyjątek poza granicami tablicy.
public static boolean isSorted(int[] a) 
{
int i;
for(i = 0; i < a.length; i ++);{
if (a[i] < a[i+1]) {
return true;
} else {
return false;
}
}
}
public static void main(String[] args)
{
int ar[] = {3,5,6,7};
System.out.println(isSorted(ar));
}

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Rzućmy okiem na czystszą wersję zbudowanej pętli:
for (i = 0; i < a.length; i++); { 
if (a[i] < a[i + 1]) {
return true;
}
else {
return false;
}
}

Muszę najpierw wskazać błąd składni w oryginalnej pętli. Mianowicie, przed nawiasem klamrowym (
{
) znajduje się średnik (
;
), który rozpoczyna treść pętli. Ten średnik należy usunąć.
Zwróć też uwagę, że ponownie sformatowałem przestrzeń kodu, aby była bardziej czytelna.
Omówmy teraz, co dzieje się w Twojej pętli. Iterator pętli
i
zaczyna się od
0
i kończy na
a.length - 1
. Ponieważ
i
działa jako indeks tablicy, warto określić, że
a [0]
jest pierwszym elementem, a
a [a.length - 1]
- ostatni element twojej tablicy. Jednak w treści pętli wpisałeś również indeks
i + 1
. Oznacza to, że jeśli
i
to
a.length - 1
, to twój indeks to
a.length
, czyli poza granicami tablicy.
Funkcja
isSorted
również ma poważne problemy, ponieważ zwraca prawdę za pierwszym razem
a [i] & < a [i + 1]
i false za pierwszym razem, gdy tak nie jest; stąd w rzeczywistości nie sprawdza, czy tablica jest w ogóle posortowana! Najprawdopodobniej sprawdza tylko sortowanie pierwszych dwóch rekordów.
Funkcja o podobnej logice, ale która sprawdza, czy tablica jest rzeczywiście posortowana, to
public static boolean isSorted(int[] a) {
// Our strategy will be to compare every element to its successor.
// The array is considered unsorted
// if a successor has a greater value than its predecessor.
// If we reach the end of the loop without finding that the array is unsorted,
// then it must be sorted instead.// Note that we are always comparing an element to its successor.
// Because of this, we can end the loop after comparing
// the second-last element to the last one.
// This means the loop iterator will end as an index of the second-last
// element of the array instead of the last one.
for (int i = 0; i < a.length - 1; i++) {
if (a[i] > a[i + 1]) {
return false;// It is proven that the array is not sorted.
}
} return true;// If this part has been reached, the array must be sorted.
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dla tych, którzy używają Java 8 i nowszych wersji, oto prosta jedna linijka:
public static boolean isSorted(int[] array) {
return IntStream.range(0, array.length - 1).noneMatch(i -> array[i] > array[i + 1]);
}

Lub logicznie równoważna alternatywa:
public static boolean isSorted(int[] array) {
return IntStream.range(0, array.length - 1).allMatch(i -> array[i] <= array[i + 1]);
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Za pomocą tego wyrażenia
a [i + 1]
uruchamiasz od końca tablicy.
Jeśli musisz porównać z następującym elementem, zatrzymaj iterację 1 elementu wcześniej (i usuń średnik, który Java zinterpretuje jako treść pętli
for
):
// stop one loop early ---v v--- Remove semicolon here
for(i = 0; i < a.length - 1; i ++){
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

int i;
for(i = 0; i < a.length - 1 && a[i] < a[i+1]; i++){}
return (i == a.length - 1);

  • uzyskuje dostęp tylko do elementów tablicy, ostatnia część warunku końcowego nie przetwarzane, jeśli pierwsza część jest fałszywa
  • zatrzymuje się na pierwszym nieposortowanym elemencie
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

a [i + 1]
, gdy
i == a.length
zwróci ten błąd.
Na przykład w tablicy o długości 10 masz elementy od 0 do 9.
a [i + 1]
gdy
i
ma wartość 9, pokaże
a [10]
poza zakresem.
Naprawić:
for(i=0; i < a.length-1;i++)

Ponadto, twój kod nie sprawdza całej tablicy, gdy tylko wywoływana jest funkcja return, pętla kontrolna się kończy.
Po prostu sprawdzasz pierwszą wartość i tylko pierwszą wartość.
AND masz średnik po deklaracji pętli for, co również powoduje problemy
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby sprawdzić, czy tablica jest posortowana, czy nie, możemy porównać sąsiednie elementy w tablicy.
Sprawdzenie granic
null
& amp;
a.length == 0
public static boolean isSorted(int[] a){  if(a == null) {
//Depends on what you have to return for null condition
return false;
}
else if(a.length == 0) {
return true;
}
//If we find any element which is greater then its next element we return false.
for (int i = 0; i < a.length-1; i++) {
if(a[i] > a[i+1]) {
return false;
}
}
//If array is finished processing then return true as all elements passed the test.
return true;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie powinieneś używać
a [i + 1]
, ponieważ ta wartość może, ale nie musi, wyjść z tablicy.
Na przykład:
A = {1, 2, 3}
// A.length is 3.
for(i = 0; i < a.length; i ++)// A goes up to 3, so A[i+1] = A[4]

Aby to naprawić, po prostu zatrzymaj cykl o jeden wcześniej.
int i;
for(i = 0; i < a.length - 1; i ++);{ if (a[i] < a[i+1]) { return true;
}else{
return false; }}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Malejąca tablica również jest sortowana. Aby uwzględnić zarówno tablice rosnąco, jak i malejąco, używam:
public static boolean isSorted(int[] a){
boolean isSorted = true;
boolean isAscending = a[1] > a[0];
if(isAscending) {
for (int i = 0; i < a.length-1; i++) {
if(a[i] > a[i+1]) {
isSorted = false;
break;
}
}
} else {//descending
for (int i = 0; i < a.length-1; i++) {
if(a[i] < a[i+1]) {
isSorted = false;
break;
}
}
}
return isSorted;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

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

Ta funkcja sprawdza, czy tablica jest w porządku rosnącym, czy nie.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

boolean checkElements(int arr[], int first, int last) {
while(arr.length > first) {
if(arr[i] > arr[last-1]) {
if(arr[i] > arr[i+1])
return checkElements(arr, first+1, first+2);;
return false;
}else {
if(arr[i] < arr[i+1])
return checkElements(arr, first+1, first+2);
return false;
}
}
return true;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli chcesz sprawdzić, czy tablica jest posortowana DESC czy ASC:
boolean IsSorted(float [] temp)
{
boolean result=true,result2=true;
for (int i = 0; i < temp.length-1; i++)
if (temp[i]< temp[i + 1])
result= false; for (int i = 0; i < temp.length-1; i++)
if (temp[i] > temp[i + 1])
result2= false; return result||result2;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

bool checkSorted(int a[], int n) {
for (int i = 1; i < n-1; i++) {
if (a[i] > a[i-1]) {
return false;
}
}
return true;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Array.prototype.every
https://developer.mozilla.org/ ... every
metoda

every()

sprawdza, czy wszystkie elementy tablicy przeszły test zaimplementowany przez podaną funkcję.
arr.every(function (a, b) {
return a > b;
});var arr = [1,2,3]// truevar arr = [3,2,1]// false

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się