2013-10-18 20 views
5

Ich schreibe ein einfaches Programm das nur wahr zurückgibt, wenn ein Array ist sonst falsch sortiert und ich bekomme immer eine Ausnahme in Eclipse und ich kann einfach nicht herausfinden, warum. Ich habe mich gefragt, ob sich jemand meinen Code anschauen und erklären könnte, warum ich eine Array-Exception bekomme. Vielen Dank für Ihre Hilfe im fortgeschrittenen Stadium.Prüfen, ob ein Array sortiert ist, true oder false zurückgeben

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)); 
} 
+3

Post die Ausnahme – Cruncher

+0

Führen Sie Ihren Code durch. Sie haben 4 Einträge, es sollte einfach sein. "i" wird irgendwann gleich 3, was wird ein [3 + 1] versuchen zu erreichen? – cklab

+1

überprüfen Sie Ihre Indexgrenzen –

Antwort

23

die bei einer saubereren Version der Schleife aussehen Lassen Sie konstruiert:

for (i = 0; i < a.length; i++); { 
    if (a[i] < a[i + 1]) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

Ich sollte zuerst die Syntaxfehler in der ursprünglichen Schleife hinweisen. Es gibt nämlich ein Semikolon (;) vor der geschweiften Klammer ({), die den Körper der Schleife startet. Dieses Semikolon sollte entfernt werden. Beachten Sie auch, dass ich den Leerraum des Codes neu formatiert habe, um ihn lesbarer zu machen.

Jetzt diskutieren wir, was in Ihrer Schleife passiert. Der Schleifeniterator i beginnt bei 0 und endet bei a.length - 1. Da i als Index für Ihr Array fungiert, macht es Sinn, darauf hinzuweisen, dass a[0] das erste Element und a[a.length - 1] das letzte Element Ihres Arrays ist. Im Körper Ihrer Schleife haben Sie jedoch auch einen Index von i + 1 geschrieben. Das bedeutet, wenn i gleich a.length - 1 ist, ist Ihr Index gleich a.length, die außerhalb der Grenzen des Arrays ist.

Die Funktion isSorted hat auch erhebliche Probleme, wie es beim ersten Mal a[i] < a[i+1] wahr und falsch das erste Mal ist es nicht; Ergo überprüft es eigentlich nicht, ob das Array überhaupt sortiert ist! Es prüft nur, ob die ersten beiden Einträge sortiert sind.

Eine Funktion mit ähnlichen Logik, aber das ist wirklich sortiert ist, wenn das Array prüft

ist
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. 
} 
+0

Vielen Dank für Ihre Hilfe, ich verstehe jetzt – user2101463

+0

@ user2101463 Froh zu helfen –

+0

Worst Case Komplexität ist O (n). Was ist die durchschnittliche Zeitkomplexität angesichts der zufälligen Auswahl von Daten aus einer Normalverteilung? Ist es wirklich O (1)? Scheint wie ein Bündel von abnehmenden geometrischen Reihen, deren Summe eine andere geometrische Reihe ist, die nur 4 als n gibt, nähert sich n → ∞ folglich O (1). Ist das wahr? –

1

a[i+1] wenn i == a.length werden Sie diesen Fehler geben.

beispielsweise in einem Array mit einer Länge von 10, haben Sie die Elemente 0 bis 9.

a[i+1] wenn i 9 ist, wird a[10] zeigen, die außerhalb der Grenzen ist.

zu beheben:

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

Auch der Code überprüft nicht durch die ganze Reihe, sobald Rückkehr aufgerufen wird, wird die Überprüfung-Schleife beendet. Sie überprüfen einfach den ersten Wert und nur den ersten Wert.

AND, haben Sie ein Semikolon nach dem for-Schleife Erklärung, die auch Fragen

+0

Ahhhh! Ich sehe jetzt, Danke für Ihre Hilfe – user2101463

2

Mit diesem Ausdruck verursacht, a[i+1], Sie führen das Ende des Arrays ab.

Wenn Sie auf das nächste Element vergleichen müssen, dann früh Ihre Iteration 1 Element stoppen (und beseitigen das Semikolon, die Java als for Schleifenkörper interpretieren würde):

// stop one loop early ---v  v--- Remove semicolon here 
for(i = 0; i < a.length - 1; i ++){ 
0

Sie nicht a[i+1] verwenden sollten weil dieser Wert von dem Array abweichen kann oder nicht.

Zum Beispiel:

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] 

Um dies zu beheben, beenden Sie einfach die Schleife einen Anfang.

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

    if (a[i] < a[i+1]) { 

     return true; 
    }else{ 
     return false; 

    } 

} 
+0

ein int-Array kann nicht null sein. Auch wenn Ihr Code die Ausnahme löst, erreicht er nicht das, was die Methode zum Erreichen –

+0

Sorry, Sie sind richtig. Fest. – dtgee

1

Um zu überprüfen, ob ein Array sortiert ist oder nicht, können wir benachbarte Elemente im Array vergleichen.

prüfen Randbedingungen null & 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; 
} 
2
int i; 
for(i = 0; i < a.length - 1 && a[i] < a[i+1]; i++){} 
return (i == a.length - 1); 
  • greift nur auf Array-Elemente, letzte Teil der Endbedingung nicht falsch
  • Anschläge auf den ersten, wenn der erste Teil ist nicht verarbeitet sortiertes Element
-3

Array.prototype.every

Die jeder() Methode testet, ob alle Elemente in der Anordnung den Test durch die vorgesehene Funktion implementiert passieren.

arr.every(function (a, b) { 
    return a > b; 
}); 

var arr = [1,2,3] // true 

var arr = [3,2,1] // false 
+0

bemerkte, das war eine Frage über Java, aber Überprüfung der src von.Jedes() wird etwas Licht abwerfen;) – iamwhitebox

+0

Diese Antwort ist falsch, nicht nur weil sie für 'js' gedacht ist, sondern auch weil sie nicht das tut, was sie tun soll. 'Jede' Funktion testet nur ein Element zu der Zeit, also ist arg' b' in diesem Fall der Index des Elements 'a'. Die angegebene Funktion testet also nur, ob 'arr [i]> i' ist. Für '[5, 3, 5]' gibt es 'true', während für' [0, 1, 2] '' false' zurückgibt. –

0

Ein absteigendes Array wird ebenfalls sortiert. Um sowohl für Konto auf- und absteigende Arrays, verwende ich die folgenden:

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; 
} 
0
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; 
} 

Diese Funktion überprüft, ob das Array in aufsteigender Reihenfolge ist oder nicht.

+1

Würdest du bitte deine Antwort erklären? –

+3

Willkommen bei Stack Overflow! Während dieses Code-Snippet die Frage lösen kann, einschließlich einer Erklärung von * wie * und * warum *, löst dies das Problem [würde wirklich helfen] (// meta.stackexchange.com/q/114762), um die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, nicht nur die Person, die jetzt fragt! Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung hinzuzufügen und geben Sie an, welche Einschränkungen und Annahmen gelten. –

+0

Willkommen beim Stapelüberlauf :-) Bitte schauen Sie auf [antwort]. Sie sollten einige Informationen angeben, warum Ihr Code das Problem löst. Code-only-Antworten sind für die Community nicht nützlich. – JimHawkins

Verwandte Themen