Array Sortieren mit boolean?

Bitte aktiviere JavaScript!
Servus Leute,

ich habe die Aufgabe von einem eingelesenen Array diesen aufsteigend zu sortieren also bsp: [1,3,2] soll zu [1,2,3] werden. Jedoch fehlt mir hier der ansatz wie ich sowas sortieren kann. Meine überlegung war bis jetzt :

Code:
static boolean sortiereArray(int a[]){ //Parameter übergabe des Arrays von der einzulesenden Funktion
    for(int i = 0; i < a.length; i++){
        for(int j = i; j < length; j++){
            if(a[i] > a[j]){
            a[j] = a[i];
            }
        }
    }
    return a;
}
Kommt aber immer nicht das richtig raus und ich weiß leider nicht weiter, vor allem ist wichtig das ich es mit dem Datentyp boolean löse und ich weiß nicht wie.

Freue mich über jede Hilfe.
Grüße :)
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Wenn Du Werte tauschen willst, dann musst Du einen Wert erst zwischenspeichern, dann kannst Du den gespeicherten Wert überschreiben um dann den gespeicherten Wert in das zweite Feld zu schreiben.

Java:
// Jetzt mal einfach a und b als Variablen:
int a = 1;
int b = 2;

// a und b tauschen:
// Falsch ist:
a = b; // Hier wäre der Wert, der in a gespeichert war, weg!

// richtig:
int temp = a; // Wir merken und den Inhalt von a.
a = b; // Wir überschreiben a - haben es ja gemerkt.
b = temp; // Wir überschreiben b, der original Wert ist ja jetzt in a.
 
Wenn Du Werte tauschen willst, dann musst Du einen Wert erst zwischenspeichern, dann kannst Du den gespeicherten Wert überschreiben um dann den gespeicherten Wert in das zweite Feld zu schreiben.

Java:
// Jetzt mal einfach a und b als Variablen:
int a = 1;
int b = 2;

// a und b tauschen:
// Falsch ist:
a = b; // Hier wäre der Wert, der in a gespeichert war, weg!

// richtig:
int temp = a; // Wir merken und den Inhalt von a.
a = b; // Wir überschreiben a - haben es ja gemerkt.
b = temp; // Wir überschreiben b, der original Wert ist ja jetzt in a.
Danke habe es jetzt mit einem ZwischenSpeichern hinbekommen! Zumindest das, dass Array sortiert wird. Jetzt habe ich leider ein anderes Problem, wie kann ich das mit boolean lösen? Weil jedes mal wenn ich jetzt die eingabe mache:
Beispiel:
Frage nach Größe Array = 5
dann gebe ich ein 1,3,2,4,5
Vorher wurde mir der "durcheinander Array" angezeigt jetzt seitdem ich diese Methode drin habe
wird jedes mal direkt sortiert und ich verstehe echt nicht warum.

Habe gemerkt sobald ich die "sortiere zwueisung wegmache" funktioniert was wieder ganz normal.
Code:
    //Methoden Aufrufe
            int [] eingaben = arrayEinlesen(n,in);
            int maximum = maxImArray(eingaben);
            int[] sortieren = sortiereArray(eingaben);
Einlesen Methode:
Code:
public static int[] arrayEinlesen(int n, Scanner in) {
        
        //Deklaration
        int[] a = new int[n];
        int i = 0;
        int eingabe = 0;
        
        while(i < n) {
            eingabe = in.nextInt();
            a[i] = eingabe;
            i++;   
        }
            //Rückgabewert des Arrays a
            return a;
Meine Ausgaben mache ich jeweils mit der to.String Methode.

Liebe Grüße und danke für die Hilfe!
 
Vorher wurde mir der "durcheinander Array" angezeigt jetzt seitdem ich diese Methode drin habe
wird jedes mal direkt sortiert und ich verstehe echt nicht warum.
Gewaltiger Bruder spricht mit rätselhafter Zunge. Wo willst Du ein boolean verwenden? Und wo gibst Du was aus?
In Deinem Codebeispiel ist keine einzige Ausgabe zu sehen.
 
Sorry bin noch so neu in dem Gebiet fällt mir manchmal noch echt schwer meine Probleme zu prezisieren.

Ich habe einmal diese Methode:
Code:
public static int[] arrayEinlesen(int n, Scanner in) {
        
        //Deklaration
        int[] a = new int[n];
        int i = 0;
        int eingabe = 0;
        
        while(i < n) {
            eingabe = in.nextInt();
            a[i] = eingabe;
            i++;   
        }
            //Rückgabewert des Arrays a
            return a;
... womit ich das Array einlese in der main

dort rufe ich sie dann auf und gebe Sie aus. Alles nachfolge ist in der main methode:
Code:
int [] eingaben = arrayEinlesen(n,in);
greife auf das einlesen zu und gebe es hiermit dann aus:
Code:
System.out.println(Arrays.toString (eingaben));
Jetzt kann ich ja beliebige Arrays einlesen lassen. Doch sollte ich laut Aufgabenstellung nun noch eine Methode erstellen um die diese Sortiert mit boolean. Aufsteigend und absteigend.

Jetzt habe ich diese Methode implementiert für aufsteigend :
Code:
public static int[] sortiereArray(int a[]) {
        for(int i = 0; i < a.length; i++) {
            for(int j = i; j < a.length; j++) {
                if(a[i] > a[j]) {
                    int zwischenSpeicher = a[i];
                    a[i] = a[j];
                    a[j] = zwischenSpeicher;
                }
            }
        }
        return a;
... um zuerst mal aufsteigend zu machen aber ohne boolean weil ich einfach nicht weiß welche möglichkeit es gäbe einen Array zu sortieren mit dem Datentyp boolean im bezug auf aufsteigend anzeigen lassen, oder absteigend je nach dem was der Nutzer möchte.

Dann gebe ich in der main diese Methode aus um mein vorheriges Array zu sortieren´:
Code:
int[] sortieren = sortiereArray(eingaben);

System.out.println(Arrays.toString(sortieren));
Jetzt ist mein Problem das, jetzt auch immer der eingelesene Array direkt sortiert wird.
Meine Ausgabe:
Hallo, bitte geben Sie die größe Ihres Arrays ein:
5
Geben Sie nun nach und nach Zahlen zum füllen ein:
1
3
2
4
5
Ihr eingebener Array
[1, 2, 3, 4, 5] -> hier müsste doch eigentlich der Array stehen wie es eingelesen wurde?
[1, 2, 3, 4, 5] -> und hier der Sortierte

Jetzt sind immer beide direkt Sortiert und ich verstehe nicht warum :/
 
Also ein Array wird als Referenz übergeben. Änderungen an einem übergebenen Array sind somit nicht nur lokal sondern überall vorhanden.

Also musst du das Array auch nicht mehr zurück geben, da das Original Array sortiert ist.
Wenn du eine Kopie sortieren willst, dann musst du erst das Array clonen um dann den Clon zu sortieren und zurück zu geben.
 
Und was das boolean betrifft, sollst Du etwas wie

Java:
public static int[] sortiereArray(int a[], boolean aufsteigend) {
schreiben, damit Du beim Sortieren angeben kannst, ob auf- oder absteigend.
 
Also ein Array wird als Referenz übergeben. Änderungen an einem übergebenen Array sind somit nicht nur lokal sondern überall vorhanden.

Also musst du das Array auch nicht mehr zurück geben, da das Original Array sortiert ist.
Wenn du eine Kopie sortieren willst, dann musst du erst das Array clonen um dann den Clon zu sortieren und zurück zu geben.
Danke für den Hinweis habe das Array kopiert und es läuft jetzt mit dem Aufsteigen in der Methode so wie ich es mir vorstelle.

Code:
int [] originalArray = arrayEinlesen(n,in);
            int [] kopieArray = new int[originalArray.length]; //neues Array alloziren
            for(int i = 0; i < originalArray.length; i++) {
                kopieArray[i] = originalArray[i];
            }
Und was das boolean betrifft, sollst Du etwas wie

Java:
public static int[] sortiereArray(int a[], boolean aufsteigend) {
schreiben, damit Du beim Sortieren angeben kannst, ob auf- oder absteigend.
Danke für deinen Hinweis, ganz genau verstanden habe ich es aber glaub noch nicht. Also ich möchte ja das der Benutzer bei der Sortierung entscheiden kann ob er es auf oder absteigend haben möchte. Ganz einfach gesagt boolean hat ja true oder false, muss ich dann irgendwie zuweisen das aufsteigend -> false und absteigend -> true und dann wird das in der Methode gemacht und der benutzer bekommt das zurück? Muss ich dann auch die syso's in der Methode verpacken wo bspw. gefragt wird "möchten sie auf oder ab.." ? Kann ich überhaupt in einer Methode jeweils abfragen nach auf oder absteigend oder müssen das zwei Methoden werden?

Liebe Grüße und Danke nochmal.
 
Also der Name besagt es ja: Aufsteigend? Ja/Nein
Also wenn aufsteigend true ist, dann soll es aufsteigend sortiert werden und wenn aufsteigend false ist, dann soll es absteigend sortiert werden. Das ist bei zwei Werten durchaus üblich.
Wenn Dir das noch nicht ausreichend ist, dann kannst Du den Parameter noch umbennen a.la. "sortiereAufsteigend" oder so...

Es gibt aber - wie so oft - immer viele Wege, die zum Ziel führen.
Man könnte eine Enum "Sortierfolge" erstellen mit "AUFSTEIGEND" und "ABSTEIGEND" und dann hätte man als Parameter kein boolean mehr sondern die Sortierfolge und man würde übergeben "Sortierfolge.AUFSTEIGEND" bzw. "Sortierfolge.ABSTEIGEND".
 
Also ich möchte ja das der Benutzer bei der Sortierung entscheiden kann ob er es auf oder absteigend haben möchte. Ganz einfach gesagt boolean hat ja true oder false, muss ich dann irgendwie zuweisen das aufsteigend -> false und absteigend -> true und dann wird das in der Methode gemacht und der benutzer bekommt das zurück? Muss ich dann auch die syso's in der Methode verpacken wo bspw. gefragt wird "möchten sie auf oder ab.." ? Kann ich überhaupt in einer Methode jeweils abfragen nach auf oder absteigend oder müssen das zwei Methoden werden?

Liebe Grüße und Danke nochmal.
Und ganz überlesen: Hier geht es erst einmal nur um eine Funktion, die sortiert. Wenn Du willst, dass der Benutzer das angibt, dann musst Du natürlich noch abfragen, wie der Benutzer es sortiert haben will.

Also da, wo Du die Zahlen abfragst kommt dann am Ende: "Wie soll sortiert werden? (Absteigend / Aufsteigend)" oder um die Eingabe kürzer zu machen, kannst Du ja fragen "Soll aufsteigend sortiert werden? (Ja / Nein)" oder so. Das fragst Du dann ab und abhängig von der Eingabe hast Du dann den Parameter für die Funktion.
 
Also ich möchte ja das der Benutzer bei der Sortierung entscheiden kann ob er es auf oder absteigend haben möchte.
OK, ich denk Du hast noch ein Problem damit, die Dinge gedanklich zu trennen. Deine Sortiermethode sortiert - ohne, dass dabei ein Benutzer involviert wäre - ein gegebenes Array und gibt das sortierte Array zurück. Aktuell geschieht das aufsteigend.

Du könntest also Deine Methode umbenennen zu
Code:
public static int[] sortiereAufsteigend(int a[]) {
und eine zusätzliche Methode schreiben:
Code:
public static int[] sortiereAbsteigend(int a[]) {
Die müsste dann natürlich das Array absteigend sortieren.

Das hat alles noch nichts mit dem Benutzer zu tun. Den kannst Du aber fragen: Soll das Array aufsteigend sortiert werden? Dann kannst Du seine Eingabe überprüfen und die betreffende Methode aufrufen, z. B.
Java:
String antwort = scanner.nextLine();
int[] sortiert;
if (antwort.equals("ja")) {
    sortiert = sortiereAufsteigend(eingaben);
} else {
    sortiert = sortiereAbsteigend(eingaben);
}
Würde funktionieren. Aber: Du hast jetzt zwei sortier-Methoden, die fast identisch sind. Daher könnte man auf die Idee kommen, die beiden Methoden zusammenzulegen und über einen Parameter zu entscheiden, ob auf- oder absteigend sortiert werden soll. Dann kommt beispielsweise die im vorherigen Kommentar genannte Methode raus:
Java:
public static int[] sortiereArray(int a[], boolean aufsteigend) {
Der Code, der sich um den Benutzer und den Aufruf der Sortiermethode kümmert, kann dann so aussehen:
Java:
String antwort = scanner.nextLine();
boolean aufsteigendeSortierung = antwort.equals("ja");
sortiert = sortiereArray(eingaben, aufsteigendeSortierung);
 
OK, ich denk Du hast noch ein Problem damit, die Dinge gedanklich zu trennen. Deine Sortiermethode sortiert - ohne, dass dabei ein Benutzer involviert wäre - ein gegebenes Array und gibt das sortierte Array zurück. Aktuell geschieht das aufsteigend.

Du könntest also Deine Methode umbenennen zu
Code:
public static int[] sortiereAufsteigend(int a[]) {
und eine zusätzliche Methode schreiben:
Code:
public static int[] sortiereAbsteigend(int a[]) {
Die müsste dann natürlich das Array absteigend sortieren.

Das hat alles noch nichts mit dem Benutzer zu tun. Den kannst Du aber fragen: Soll das Array aufsteigend sortiert werden? Dann kannst Du seine Eingabe überprüfen und die betreffende Methode aufrufen, z. B.
Java:
String antwort = scanner.nextLine();
int[] sortiert;
if (antwort.equals("ja")) {
    sortiert = sortiereAufsteigend(eingaben);
} else {
    sortiert = sortiereAbsteigend(eingaben);
}
Würde funktionieren. Aber: Du hast jetzt zwei sortier-Methoden, die fast identisch sind. Daher könnte man auf die Idee kommen, die beiden Methoden zusammenzulegen und über einen Parameter zu entscheiden, ob auf- oder absteigend sortiert werden soll. Dann kommt beispielsweise die im vorherigen Kommentar genannte Methode raus:
Java:
public static int[] sortiereArray(int a[], boolean aufsteigend) {
Der Code, der sich um den Benutzer und den Aufruf der Sortiermethode kümmert, kann dann so aussehen:
Java:
String antwort = scanner.nextLine();
boolean aufsteigendeSortierung = antwort.equals("ja");
sortiert = sortiereArray(eingaben, aufsteigendeSortierung);
VIelen Dank für deine Antwort!
Also das obere habe ich verstanden macht auch Sinn so für mich, Danke! Aber wie Sie bereits geschrieben haben das man diese Methode zusammenlegen könnte und mit dem boolean, da verheddere ich mich noch irgendwie. Das problem ist ich hänge mich total auf das meine Methode als return ein boolean haben muss, bei der Methode oben wäre der rückgabewert ein int. Und gibt es eine alternative zu dem .equals ich glaub das dürfen wir noch nicht beuntzen weil wir soweit noch nicht sind.
Was mir einfällt wäre == operator aber dann wäre es wieder eine magic Number, die ich ebenfalls nicht benutzen darf...
Meine Idee erstmal:
Ich füge dann noch einen paramter "boolean absteigend" hinzu ? Und noch den paramter "antwort"? diesen dann mit if in der Methode verzweigen wenn dann der benutzer z.b. "Ja" eingeben würde? wäre es true und er springt in den ablauf "aufsteigen sortieren" und dann return aufsteigend. Und bei false wäre ja dann egal was er eingibt oder? Und dieses dann einfach return absteigend. Puh dann muss ich aber auch das array a wieder in die beiden jeweils kopieren das ich es an die main liefern kann und als sorties Array ausgeben kann?
 
als return ein boolean haben muss, bei der Methode oben wäre der rückgabewert ein int.
Moment, nicht dass wir jetzt aneinander vorbeireden. Wieso muss der Rückgabewert ein boolean sein und welche Bedeutung soll der Rückgabewert denn haben?

Ich füge dann noch einen paramter "boolean absteigend" hinzu ?
Wenn Du schon einen boolean-Parameter aufsteigend hast, dann brauchst Du keinen zusätzlichen Parameter absteigend, denn "nicht aufsteigend" ist gleichbedeutend mit absteigend :)

Und gibt es eine alternative zu dem .equals ich glaub das dürfen wir noch nicht beuntzen weil wir soweit noch nicht sind.
Was mir einfällt wäre == operator aber dann wäre es wieder eine magic Number, die ich ebenfalls nicht benutzen darf...
Meine Idee erstmal:
Du kannst auch boolean antwort = scanner.nextBoolean(); benutzen. Dann muss der Anwender "true" oder "false" eingeben und Du brauchst keinen Vergleich durchzuführen.

Puh dann muss ich aber auch das array a wieder in die beiden jeweils kopieren das ich es an die main liefern kann und als sorties Array ausgeben kann?
Nein, da kannst Du jetzt den Effekt nutzen, den Du vor dem Kopieren des Arrays hattest. Dazu kommen wir vermutlich später nochmal :)
 
Moment, nicht dass wir jetzt aneinander vorbeireden. Wieso muss der Rückgabewert ein boolean sein und welche Bedeutung soll der Rückgabewert denn haben?




Wenn Du schon einen boolean-Parameter aufsteigend hast, dann brauchst Du keinen zusätzlichen Parameter absteigend, denn "nicht aufsteigend" ist gleichbedeutend mit absteigend :)



Du kannst auch boolean antwort = scanner.nextBoolean(); benutzen. Dann muss der Anwender "true" oder "false" eingeben und Du brauchst keinen Vergleich durchzuführen.


Nein, da kannst Du jetzt den Effekt nutzen, den Du vor dem Kopieren des Arrays hattest. Dazu kommen wir vermutlich später nochmal :)
Ja also in der Aufgabenstellung steht halt, man soll von einem eingelesenen Array, diese funktion habe ich bereits schon. Diesen sortieren und als Rückgabewert soll es ein boolean sein.

"Beim Programmieren mit Arrays werden in verschiedenen Aufgaben immer wieder die gleichen Funktionen benötigt. Dazu gehört: Maximum im Array und ist das Array sortiert? Implementie-ren Sie diese Funktionen. Für die erste Funktion soll der Index des entsprechenden Elements zurückgegeben werden. Die zweite Funktion gibt einen Boolean zurück. "
 
Das ist dann aber nicht die Sortieren Funktion, sondern eine Funktion "istDasArraySortiert".

Und ja, da kommt dann ein boolean raus.
 
Das ist dann aber nicht die Sortieren Funktion, sondern eine Funktion "istDasArraySortiert".

Und ja, da kommt dann ein boolean raus.
Ja dann wäre ja nur die Frage ob es ab oder auf ist? Sprich wahr oder Falsch, aber gestern hatten wir nochmal besprochen und da wurde uns gesagt wir sollen, es ab und auf steigend programmieren. Somit würde das gar nciht mit dem boolean gehen?
 
Ja doch, natürlich geht das. Die Frage "Ist das Array sortiert?" ist eine klare Ja / Nein Frage. Aber aus der Antwort Ja kannst Du nicht schließen, wie es sortiert ist.

Ist das Auto lackiert? -> Ja / Nein Frage. Aber welche Farbe das Auto hat, wenn es denn lackiert wurde, ist offen.

Das ist auch das, worauf man immer aufpassen muss! Du hast klare Namen und die müssen stimmig sein!

Und das ist oft schwer. Ist das Array sortiert? Dein Array mit Eingaben ist auch sortiert! Und zwar liegen die Eingaben sortiert nach ihrer Eingabefolge vor. Die zuerst eingegebene Zahl ist an erster Stelle, die zweite Zahl an zweiter Stelle, u.s.w....

Oder stell Dir als Sortierkriterium vor, dass Du von jeder Zahl die Quadratwurzel nimmst um dann nur die Nachkommastellen zu werten (also immer 0,<Nachkommastellen der Quadratwurzel>) ...

Aber das ist jetzt Haarspaltereien. Man sollte sich auf seine (vereinfachte) Problemdomäne beziehen und die bedeutet bei dir: Aufsteigend und Absteigend. Und danach prüfst Du dann ein Array.
 
Doch, Du kannst der Methode ja auch mitgeben, ob sie nach aufsteigender Sortierung prüfen soll, oder nicht.

Der Ansatz ist trivial:
Java:
public boolean istSortiert(int[] werte, boolean aufsteigend) {
    for (int i = 0; i < werte.length-1; i++) {
        if (werte[i] > werte[i+1]) {
            return false;
        }
    }
    return true;
}
Das boolean aufsteigend darfst Du jetzt aber selbst einbauen :)
 
OK, mit dieser Methode würde ich quasie prüfen ob mein Array sortiert ist oder nicht, und das bekomme ich auch als Rückgabe. Wenn es ich sortieren lassen möchte muss ich ja dann noch eine Extra Methode schreiben, ich kann ja schlecht zwei Rückgabewerte in eine Methode packen. Das probiere ich dann mal.

Ich danke euch sehr für die Hilfe!
 
mit dieser Methode würde ich quasie prüfen ob mein Array sortiert ist oder nicht, und das bekomme ich auch als Rückgabe.
Richtig.

Wenn es ich sortieren lassen möchte muss ich ja dann noch eine Extra Methode schreiben
Genau. Das Sortieren ist etwas anderes als das Prüfen, ob etwas sortiert ist. Übrigens auch von der Laufzeit her (die Prüfung geht schneller). Schon deswegen bieten sich zwei Methoden an.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben