Zum Inhalt springen

java bubblesort


antenne

Empfohlene Beiträge

Hallo an alle.

Kurz zu mir. Ich bin 27 Jahre alt und musste nach einer Berufskrankheit den Job wechseln. Deshalb mache ich jetzt eine Umschulung zum FISI. Dadurch das es eine Umschulung ist, steige ich ins 2. Lehrjahr ein. Und habe ziemliche Probleme beim Java Unterricht. Das liegt nicht unbedingt daran, dass ich es nicht verstehe, sondern eher das der Lehrer wohl selbst nicht viel Ahnung von Java hat und daher jedes mal nur Übungen am Beamer zeigt und die Schüler es lösen sollen. Jegliche Fragen werden mit einem "hmmmm" und anschließendem langsamen entfernen von meinem Platz beantwortet... Daher versuche ich in Eigenregie Java zu lernen. Eine Gute Übung erschien mir Zahlen zu sortieren. Bei 3 Zahlen hat es mich schon gut eine Stunde gekostet und nur mit viel Hilfe durch Google hat es geklappt. Bei 4 Zahlen geht allerdings gar nichts mehr. Ich habe dann etwas geschaut und bin immer wieder auf den Algorithmus "Bubblesort" gestoßen. Ich werde allerdings überhaupt nicht schlau daraus....leider. Mit vorgegebenen Zahlen macht er dank copy und paste was er soll. Wie krieg ich es aber hin, dass er von Hand eingegebene Zahlen sortiert? Hier erstmal mein erster kläglicher entwurf ( Habe nur etwas abgeändert,der Rest ist kopiert)

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BubbleSort {
    private static int[] xs;

    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        System.out.print("Erste Zahl: ");
        String eingabe1 = br.readLine();
        System.out.print("Zweite Zahl: ");
        String eingabe2 = br.readLine();
        System.out.print("Dritte Zahl: ");
        String eingabe3 = br.readLine(); {
      boolean unsortiert=true;
      int temp;
      
      while (unsortiert){
         unsortiert = false;
         xs = null;
        for (int i=0; i < xs.length-1; i++)
            if (xs > xs[i+1]) {                      
               temp       = xs;
               xs       = xs[i+1];
               xs[i+1]     = temp;
               unsortiert = true;
            }          
      }
   }
   
    {
       int zahl1 = Integer.parseInt(eingabe1);
        int zahl2 = Integer.parseInt(eingabe2);
        int zahl3 = Integer.parseInt(eingabe3);
      sortiere(zahl1,zahl2,zahl3);
      
             
    


    
    }
}
    

    private static void sortiere(int zahl1, int zahl2, int zahl3) {
        // TODO Auto-generated method stub
        
    }
}

 

Die Javabegapten unter euch werden sich jetzt wahrscheinlich fragen wie man nur so ein Käse schreiben kann, ich bitte daher um etwas Verständnis :(

 

Achja ich schreibe das ganze Java Zeug mit Eclipse weil wir das auch in der Schule haben. Und Eclipse gibt keine Fehler aus.

Bearbeitet von antenne
Link zu diesem Kommentar
Auf anderen Seiten teilen

public class BubbleSort { 
   public static void sortiere(int[] x) {
      boolean unsortiert=true;
      int temp;
      
      while (unsortiert){
         unsortiert = false;
         for (int i=0; i < x.length-1; i++) 
            if (x > x[i+1]) {                      
               temp       = x;
               x       = x[i+1];
               x[i+1]     = temp;
               unsortiert = true;
            }          
      } 
   }
   
   public static void main(String[] args) {
      int[] liste = {0,9,4,6,2,8,5,1,7,3};
      sortiere(liste);
      for (int i=0; i<liste.length; i++) 
         System.out.print(liste+" ");    
   } 
}

Der Originalquellcode. Habe nur rote X'e geändert, je nachdem was Eclipse vorgeschlagen hat. War aber bestimmt totaler murks. Mich wundert ja , dass keine Fehler angezeigt werden aber beim Ausführen dann dieser Fehler kommt:

Exception in thread "main" java.lang.NullPointerException
    at BubbleSort.main(BubbleSort.java:23)


(nicht beim orignialen Code sondern bei meinem Abgeänderten)

Bearbeitet von antenne
Link zu diesem Kommentar
Auf anderen Seiten teilen

Zuerst eine Erkenntnis: Vorgegebene Zahlen sortiert man genau gleich wie vom Benutzer eingegebene. Klingt trivial, ist aber wichtig.

Das bedeutet nämlich, dass du die Methode sortiere nicht ändern musst, nur die Methode main, wo die Zahlen herkommen. Dort wird das Array liste direkt im Code befüllt. Diesen Teil des Codes musst du durch eine Benutzereingabe ersetzen, sonst nichts.

Habe nur rote X'e geändert, je nachdem was Eclipse vorgeschlagen hat.

Diese Vorgehensweise bringt leider gar nichts. Der Compiler ist zufrieden, wenn er das Programm übersetzen kann. Er kann nicht erkennen, ob das Programm das Richtige tut.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Diesen Teil des Codes musst du durch eine Benutzereingabe ersetzen, sonst nichts.

 

Und wie? habe ja an so etwas gedacht:

  •  int zahl1 = Integer.parseInt(eingabe1);
  •  int zahl2 = Integer.parseInt(eingabe2);
  •  int zahl3 = Integer.parseInt(eingabe3);

Aber natürlich kann er mit zahl1-3 und eingabe 1-3 nix anfganen weil es ja nirgends deklariert wurde. Aber wie soll es gehen das ich nur einen kleinen Teil abändere?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber natürlich kann er mit zahl1-3 und eingabe 1-3 nix anfganen weil es ja nirgends deklariert wurde. 

zahl1 bis zahl3 hast du deklariert.

Und Code für eingabe1 bis eingabe3 hast du in deinem ersten Beitrag schon gezeigt: 

        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        System.out.print("Erste Zahl: ");
        String eingabe1 = br.readLine();
        System.out.print("Zweite Zahl: ");
        String eingabe2 = br.readLine();
        System.out.print("Dritte Zahl: ");
        String eingabe3 = br.readLine();

Link zu diesem Kommentar
Auf anderen Seiten teilen

meine idee war jetzt diese

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BubbleSort {
   public static void sortiere(int[] x) {
      boolean unsortiert=true;
      int temp;
      InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader br = new BufferedReader(isr);
      System.out.print("Erste Zahl: ");
      String eingabe1 = br.readLine();
      System.out.print("Zweite Zahl: ");
      String eingabe2 = br.readLine();
      System.out.print("Dritte Zahl: ");
      String eingabe3 = br.readLine();
      int zahl1 = Integer.parseInt(eingabe1);
        int zahl2 = Integer.parseInt(eingabe2);
        int zahl3 = Integer.parseInt(eingabe3);
      
      
      while (unsortiert){
         unsortiert = false;
         for (int i=0; i < x.length-1; i++)
            if (x > x[i+1]) {                      
               temp       = x;
               x       = x[i+1];
               x[i+1]     = temp;
               unsortiert = true;
            }          
      }
   }
   
   public static void main(String[] args) {
      int[] liste = {eingabe1,eingabe2,eingabe3};
      sortiere(liste);
      for (int i=0; i<liste.length; i++)
         System.out.print(liste+" ");    
   }
}

 

aber wie erwartet funktioniert das auch nicht

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das hier ist die Stelle in main, wo das Array mit den Zahlen für die Sortierung erzeugt wird:

int[] liste = {0,9,4,6,2,8,5,1,7,3};

Du musst das Array mit den Benutzereingaben füllen, also gehört der Code zum Einlesen davor.

Und dann erstellst du das Array liste nicht aus diesen vorgegebenen Zahlen, sondern aus den Zahlen, die der Benutzer eingegeben hat.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das hier ist die Stelle in main, wo das Array mit den Zahlen für die Sortierung erzeugt wird:

int[] liste = {0,9,4,6,2,8,5,1,7,3};

Du musst das Array mit den Benutzereingaben füllen, also gehört der Code zum Einlesen davor.

Und dann erstellst du das Array liste nicht aus diesen vorgegebenen Zahlen, sondern aus den Zahlen, die der Benutzer eingegeben hat.

Sry wenn ich nerve. Bin wirklich froh, dass du mir versuchst zu helfen. Nur leider versteh ich es einfach nicht. Könntest du einen Lösungsansatz posten? Ich will natürlich so viel wie möglich selbst rausfinden aber egal was ich probiere es klappt nicht. ich hab es mit int [] liste = br.readLine{zahl1,zahl2,zahl3} probiert und ich habe br.readLine mit Integer.parseInt(eingabe1,eingabe2,eingabe3) getauscht. hat auch nix gebracht. Bin ich überhaupt nah dran oder total vorbei an der Lösung

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was du z.B. machen könntest, ist, die Zahlen mit Komma getrennt einzugeben und daraus das Array zu erzeugen. Dazu kannst du dir mal http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String) und http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#parseInt-java.lang.String-int- angucken.

Bearbeitet von arlegermi
Link zu diesem Kommentar
Auf anderen Seiten teilen

ich hab es mit int [] liste = br.readLine{zahl1,zahl2,zahl3} probiert und ich habe br.readLine mit Integer.parseInt(eingabe1,eingabe2,eingabe3) getauscht. hat auch nix gebracht. Bin ich überhaupt nah dran oder total vorbei an der Lösung

Du bist nah dran, aber du versuchst zu viel in eine Zeile zu packen. Alles, was du brauchst, hattest du schon einmal in deinem Code.

Zerlege dein Problem in Teilprobleme (das ist sowieso immer eine gute Idee). Aus dem Problem "Liste mit vom Benutzer eingegeben Zahlen erzeugen" wird dann:

  • Strings vom Benutzer einlesen (das ist der Teil mit dem InputStreamReader)
  • Eingelesene Strings in Zahlen umwandeln (das ist der Teil mit parseInt)
  • Aus den Zahlen ein Array konstruieren (so wie in der Zeile mit den vordefinierten Zahlen)

Diese drei Teile musst du einzeln umsetzen. Nacheinander. Nicht irgendwie in eine Zeile verwurschtelt.
Es gibt dafür sicher auch einen eleganten Einzeiler, aber du musst zuerst die Grundlagen verstehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Strings vom Benutzer einlesen (das ist der Teil mit dem 

InputStreamReader)

InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader br = new BufferedReader(isr);
      System.out.print("Erste Zahl: ");
      String eingabe1 = br.readLine();
      System.out.print("Zweite Zahl: ");
      String eingabe2 = br.readLine();
      System.out.print("Dritte Zahl: ");
      String eingabe3 = br.readLine();

 

sieht bei mir so aus

 

Eingelesene Strings in Zahlen umwandeln (das ist der Teil mit parseInt)

        int zahl1 = Integer.parseInt(eingabe1);
        int zahl2 = Integer.parseInt(eingabe2);
        int zahl3 = Integer.parseInt(eingabe3);

 

hab ich das

 

Aus den Zahlen ein Array konstruieren (so wie in der Zeile mit den vordefinierten Zahlen)

hab ich verschiedenste sachen probiert. hat alles nix geholfen. entweder steht da, dass die variable nicht vorhanden ist, oder es geht irgendwas anderes nicht. Keine Ahnunh. Die links hab ich mir angeschaut, aber das ist noch komplizierter geschrieben als irgendwelche java tutorials.

Link zu diesem Kommentar
Auf anderen Seiten teilen

hab ich verschiedenste sachen probiert. hat alles nix geholfen. entweder steht da, dass die variable nicht vorhanden ist, oder es geht irgendwas anderes nicht. 

Wie gesagt: Fast alles steht schon da.

Die ursprüngliche Zeile lautet
 

int[] liste = {0,9,4,6,2,8,5,1,7,3};

Wir wollen aber keine Liste mit 0, 9, 4 usw., sondern mit unseren ints. Ersetze also hier die festen Zahlen durch deine int-Variablen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie gesagt: Fast alles steht schon da.

Die ursprüngliche Zeile lautet
 

int[] liste = {0,9,4,6,2,8,5,1,7,3};

Wir wollen aber keine Liste mit 0, 9, 4 usw., sondern mit unseren ints. Ersetze also hier die festen Zahlen durch deine int-Variablen.

hab ich einmal so probiert:

int[] liste = {zahl1,zahl2,zahl3};

daraufhin erscheint diese Fehlermeldung:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    zahl1 cannot be resolved to a variable
    zahl2 cannot be resolved to a variable
    zahl3 cannot be resolved to a variable

    at BubbleSort.main(BubbleSort.java:35)


dann habe ich die variablen nocheinmal gesetzt:

int zahl1;

int zahl2;

int zahl3;

daraufhin dann diese Meldung:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    The local variable zahl1 may not have been initialized
    The local variable zahl2 may not have been initialized
    The local variable zahl3 may not have been initialized

    at BubbleSort.main(BubbleSort.java:37)

 

auch das hinzufügen des Befehls: Integer.parseInt(eingabe1) will er nicht haben

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du musst die Zahlen in main einlesen und auch da deklarieren. Nur, weil du in sortiere irgendwelche Variablen deklarierst, kennt die nicht automatisch das ganze Programm. Also irgendwie so:

public static void main(String[] args){
    int zahl1 = 0;
    int zahl2 = 0;
    int zahl3 = 0;
    // hier die Zahlen einlesen, wie du es schon in 'sortiere' machst
    // anschließend die Zahlen an 'sortiere' übergeben
}

Du solltest dich ganz dringend mit den Grundlagen von Java beschäftigen. Beispielsweise muss dir klar sein, was eine Methode und was eine Klasse ist. Und wieso eine Variable, die du in 'MethodeA' deklarierst, nicht auch in 'MethodeB' verfügbar ist.

Bearbeitet von arlegermi
Link zu diesem Kommentar
Auf anderen Seiten teilen

Du musst die Zahlen in main einlesen und auch da deklarieren. Nur, weil du in sortiere irgendwelche Variablen deklarierst, kennt die nicht automatisch das ganze Programm.

public static void main(String[] args) throws IOException {
       InputStreamReader isr = new InputStreamReader(System.in);
          BufferedReader br = new BufferedReader(isr);
          System.out.print("Erste Zahl: ");
          String eingabe1 = br.readLine();
          System.out.print("Zweite Zahl: ");
          String eingabe2 = br.readLine();
          System.out.print("Dritte Zahl: ");
          String eingabe3 = br.readLine();
          int zahl1 = Integer.parseInt(eingabe1);
            int zahl2 = Integer.parseInt(eingabe2);
            int zahl3 = Integer.parseInt(eingabe3);
      
    int[] liste = {zahl1,zahl2,zahl3};

 

so? er startet jetzt eine Abfrage von 3 Zahlen. danach kommt foglender Fehler:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    The operator > is undefined for the argument type(s) int[], int
    Type mismatch: cannot convert from int[] to int
    Type mismatch: cannot convert from int to int[]

    at BubbleSort.sortiere(BubbleSort.java:25)
    at BubbleSort.main(BubbleSort.java:48)

 

wird wohl von folgendem verursacht:

 while (unsortiert){
         unsortiert = false;
         for (int i=0; i < x.length-1; i++)
            if (x > x[i+1]) {                      
               temp       = x;
               x       = x[i+1];
               x[i+1]     = temp;
               unsortiert = true;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

ich würde gerne mal den ganzen Quellcode am Stück sehen. Die Vorredner haben schon gesagt wo der Fehler liegt. Von daher kann ich mir nicht vorstellen das es an etwas anderem liegt.

Gruß
schlumpfen

hier mein verhunzter quellcode

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BubbleSort {
   public static void sortiere(int[] x) {
      boolean unsortiert=true;
      int temp;
      InputStreamReader isr = new InputStreamReader(System.in);
      BufferedReader br = new BufferedReader(isr);
      System.out.print("Erste Zahl: ");
      String eingabe1 = br.readLine();
      System.out.print("Zweite Zahl: ");
      String eingabe2 = br.readLine();
      System.out.print("Dritte Zahl: ");
      String eingabe3 = br.readLine();
      int zahl1 = Integer.parseInt(eingabe1);
        int zahl2 = Integer.parseInt(eingabe2);
        int zahl3 = Integer.parseInt(eingabe3);
      
      
      while (unsortiert){
         unsortiert = false;
         for (int i=0; i < x.length-1; i++)
            if (x > x[i+1]) {                      
               temp       = x;
               x       = x[i+1];
               x[i+1]     = temp;
               unsortiert = true;
            }          
      }
   }
   
   public static void main(String[] args) throws IOException {
       InputStreamReader isr = new InputStreamReader(System.in);
          BufferedReader br = new BufferedReader(isr);
          System.out.print("Erste Zahl: ");
          String eingabe1 = br.readLine();
          System.out.print("Zweite Zahl: ");
          String eingabe2 = br.readLine();
          System.out.print("Dritte Zahl: ");
          String eingabe3 = br.readLine();
          int zahl1 = Integer.parseInt(eingabe1);
            int zahl2 = Integer.parseInt(eingabe2);
            int zahl3 = Integer.parseInt(eingabe3);
      
    int[] liste = {zahl1,zahl2,zahl3};
      sortiere(liste);
      for (int i=0; i<liste.length; i++)
         System.out.print(liste+" ");    
   }
}

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...