Hiilfee! Step by Step sortierung eines Arrays...

babuschka

Top Contributor
Hallo Zusammen,

ich muss leider schon wieder eure Hilfe in anspruch nehmen...
Ich habe ein Programm erstellt das einen Array von Studenten nach verschiedenen Kriterien sortieren kann, inkl. GUI. Das funktioniert soweit auch alles. Nun möchte ich aber eine weitere sortiermöglichkeit einbauen.
Ich möchte die Studentenliste nach Alter sortieren, aber step by step.
Untenstehend der aktuelle code dazu...
Ich hab mir überlegt das alles mit einem bubblesort (zeile 149)zu realisieren, aber irgendwie schaff ich es einfach nicht, als sortierkriterium "alter" zu definieren...
Was mach ich falsch? Ist der Ansatz Bubblesort richtig? und wie genau funktioniert das dann, dass ich auf der Ausgabe step by step das sortieren beobachten kann?:bahnhof:

Vielen Dank schonmal für eure Hilfe!

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.border.*;

import java.util.Iterator;
import java.util.List;
import java.util.Arrays;

import java.io.File;
/**
 * HA3 basierend auf der zweiten Hausaufgabe erstellen Sie eine grafische Visualisierung Ihres
 * Sortierprogramms. Beim Ablauf des Programms soll das sortieren dynamisch veranschaulicht werden.
 * Statten Sie das Programm dazu mit einer Schaltfläche aus, so dass sich der Benutzer durch die
 * einzelnen Sortierschritte klicken kann.
 * 
 * Diese Klasse dient dazu, eine Liste von Studenten zu verwalten und nach verschiedenen
 * Kriterien zu sortieren. Dies wird grafisch unterstützt durch eine entsprechende grafische Schnittstelle.
 * Die sortierte Ausgabe kann einzeln aufgerufen werden.

 * 
 * @author 
 * @version 1.2 04.12.2011
 */

public class Kurs
{
    private Student[] studentListe;
    
    private static final String VERSION = "Version 1.2";// setzt die Konstante für die Version des Programmes
    private JFrame fenster;// variable für das Fenster
    private JLabel dateinameLabel;
    private JButton firstButton, secondButton, thirdButton, fourthButton, fifthButton;// variablen für die Buttons
    private JTextArea workspace;// Textfeldvariable
      
    /**
     * Main-Methode, startet das Programm mit dem Befehl zur Ausführung des Konstruktors.
     */
    public static void main (String[] args)
    {
        Kurs kurs = new Kurs();
    }
       
    /**
     * Konstruktor, erzeugt einen Array, füllt diesen mit den Studenten ab und ruft die Methode zur Erzeugung
     * der GUI auf.
     */
    public Kurs()
    {
        studentListe = new Student[5];// erzeugt einen neuen Array mit 5 Positionen
        // die Studenten werden erzeugt und dem Array angefügt
        studentListe[0] = new Student();
        studentListe[0].setnummer(1);
        studentListe[0].setalter(12);
        studentListe[0].setdurchschnitt(4.3);
        studentListe[0].setname("Walterli Tell junjun.");    
        
        studentListe[1] = new Student();
        studentListe[1].setnummer(2);
        studentListe[1].setalter(467);
        studentListe[1].setdurchschnitt(2.9);
        studentListe[1].setname("Maria Stuart"); 
        
        studentListe[2] = new Student();
        studentListe[2].setnummer(3);
        studentListe[2].setalter(9);
        studentListe[2].setdurchschnitt(5.9);
        studentListe[2].setname("Fritzli Schneider"); 
        
        studentListe[3] = new Student();
        studentListe[3].setnummer(4);
        studentListe[3].setalter(2296);
        studentListe[3].setdurchschnitt(6.0);
        studentListe[3].setname("Archimedes Syrakus"); 
               
        studentListe[4] = new Student();
        studentListe[4].setnummer(5);
        studentListe[4].setalter(20);
        studentListe[4].setdurchschnitt(4.7);
        studentListe[4].setname("Greengrey vonRotz");    
        
        fensterErzeugen();//Die Methode fensterErzeugung wird aufgerufen       
    }
    
    /**
     * Methode listeAusgebenUnsortiert gibt die Liste unsortiert auf der Konsole aus.
     */
    public void listeAusgebenUnsortiert()
    {
        workspace.setText("Liste der Studenten unsortiert:\n");// die Liste der Studenten wird ausgegeben, unsortiert
        for(int i=0; i < studentListe.length; i++)
             {
             workspace.append("Alter: " + studentListe[i].getalter() + ", Name: " + studentListe[i].getname() + ", Notendurchschnitt: " +
             studentListe[i].getdurchschnitt() + ", Studentennummer: " + studentListe[i].getnummer() + "\n");
             }
        workspace.append("\n");
        workspace.append("Die gesamte Teilnehmeranzahl des Kurses beträgt " + studentListe.length + " Studenten.\n");
    }

    /**
     * Methode listeAusgebenSortiertAlter gibt den Anstoss zum sortieren der Liste nach Alter
     * und gibt diese auf der Konsole aus.
     */
    public void listeAusgebenSortiertAlter()
    {
         Arrays.sort(studentListe, new alterComparator()); // Gibt den Anstoss zum sortieren nach Alter.
         workspace.setText("Studentenliste sortiert nach Alter:\n");// Gibt die Liste sortiert nach Alter aus.
         for(int i=0; i < studentListe.length; i++)
             {
             workspace.append("Alter: " + studentListe[i].getalter() + ", Name: " + studentListe[i].getname() + ", Notendurchschnitt: " +
             studentListe[i].getdurchschnitt() + ", Studentennummer: " + studentListe[i].getnummer() + "\n");
             }
    }
          
    /**
     * Methode listeAusgebenSortiertName gibt den Anstoss zum sortieren der Liste nach Name
     * und gibt diese auf der Konsole aus.
     */
    public void listeAusgebenSortiertName()
    {
         Arrays.sort(studentListe, new nameComparator()); // Gibt den Anstoss zum sortieren nach Name.
         workspace.setText("Studentenliste sortiert nach Name:" + "\n");// Gibt die Liste sortiert nach Name aus.
         for(int i=0; i < studentListe.length; i++)
             {
             workspace.append("Name: " + studentListe[i].getname() + ", Alter: " + studentListe[i].getalter() + ", Notendurchschnitt: " +
             studentListe[i].getdurchschnitt() + ", Studentennummer: " + studentListe[i].getnummer() + "\n");
             }
    }
           
    /**
     * Methode listeAusgebenSortiertDurchschnitt gibt den Anstoss zum sortieren der Liste nach Notendurchschnitt
     * und gibt diese auf der Konsole aus.
     */
    public void listeAusgebenSortiertDurchschnitt()
    {
         Arrays.sort(studentListe, new durchschnittComparator()); // Gibt den Anstoss zum sortieren nach Durchschnittsnote.
         workspace.setText("Studentenliste sortiert nach Notendurchschnitt:" + "\n");// Gibt die Liste sortiert nach Durchschnittsnote aus.
         for(int i=0; i < studentListe.length; i++)
             {
             workspace.append("Notendurchschnitt: " + studentListe[i].getdurchschnitt() + ", Alter: " + studentListe[i].getalter() + ", Name: " +
             studentListe[i].getname() + ", Studentennummer: " + studentListe[i].getnummer() + "\n");
             }
    }
    
    /**
     * Methode bubbleSort, sortiert die Studentenliste nach Alter, step by step.
     */
     public void bubbleSort() 
    { 
        Student tmp;
        int i,j;
        int n=5;
        
        for (i=0; i<n-1; i++)
        {
            for (j=0; j<n-i-1; j++)
            {
               if (studentListe[j] == studentListe[j+1])
               {
                  tmp = studentListe[j];
                  studentListe[j] = studentListe[j+1];
                  studentListe[j+1] = tmp;
                
                  System.out.println(studentListe[j]);
               }
            }   
        }
    } 
    
    /**
     * Methode beenden, beendet das Programm.
     */
    private void beenden()
    {
        System.exit(0);
    }
    
    /**
     * Methode zeigeInfo, zeigt in einem Dialogfenster Informationen zum Programm. (Version, Name,...)
     */
    private void zeigeInfo()
    {
        JOptionPane.showMessageDialog(fenster, 
               "Studenten Sortierprogramm\n" + VERSION,
               "Info zu Studenten Sortierprogramm", 
               JOptionPane.INFORMATION_MESSAGE);
    }
    
    /**
     * Methode fensterErzeugen, Erzeugt das Fenster und die Buttons und arrangiert das Layout.
     * 
     * @ param fenster Variable für das Fenster, um die menuezeile zuzufuegen
     * @ param contentPane Variable für den "Inhalt" des Fensters
     * @ param workspace Variable für die Textarea
     * @ param dateinameLabel Variable zur Anzeige des Dateinamens
     * @ param werkzeugleiste Variable für die Fläche der Buttons, auf der die Buttons angefügt werden
     * @ param firstButton, secondButton, thirdButton, fourthButton Variablen für die Buttons zur Bedienung des Programmes
     */
    private void fensterErzeugen()
    {
        fenster = new JFrame("Studenten Sortierprogramm");// ein Fenster wird erzeugt und erhält einen Namen
        JPanel contentPane = (JPanel)fenster.getContentPane();
        contentPane.setBorder(new EmptyBorder(6, 6, 6, 6));
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        menuezeileErzeugen(fenster);// ruft die Methode menuezeileErzeugen auf um dem Fenster die menuezeile anzufuegen
        
        contentPane.setLayout(new BorderLayout(6, 6));
        
        workspace = new JTextArea(15,60);
        workspace.setLineWrap(true);
        workspace.setBorder(new EtchedBorder());
        workspace.setWrapStyleWord(true);
        workspace.setTabSize(5);
        contentPane.add(workspace, BorderLayout.CENTER);
        
        dateinameLabel = new JLabel();
        contentPane.add(dateinameLabel, BorderLayout.NORTH);
               
        JPanel werkzeugleiste = new JPanel();//erzeugt eine Fläche namens werkzeugleiste
        werkzeugleiste.setLayout(new GridLayout(0, 1));// setzt ein Grid- Layout
        
        firstButton = new JButton("Ursprungszustand");
        firstButton.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) { listeAusgebenUnsortiert(); }
                    });
        werkzeugleiste.add(firstButton);
        
        secondButton = new JButton("Sortieren nach Alter");
        secondButton.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) { listeAusgebenSortiertAlter(); }
                    });
        werkzeugleiste.add(secondButton);
        
        thirdButton = new JButton("Sortieren nach Name");
        thirdButton.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) { listeAusgebenSortiertName(); }
                    });
        werkzeugleiste.add(thirdButton);
        
        fourthButton = new JButton("Sortieren nach Note");
        fourthButton.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) { listeAusgebenSortiertDurchschnitt(); }
                    });
        werkzeugleiste.add(fourthButton);// Buttons werden der werkzeugleiste angefügt
        
        fifthButton = new JButton("Sortieren Step by Step");
        fifthButton.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) { bubbleSort(); }
                    });
        werkzeugleiste.add(fifthButton);// Buttons werden der werkzeugleiste angefügt
                
        JPanel flow = new JPanel();
        flow.add(werkzeugleiste);
        
        contentPane.add(flow, BorderLayout.WEST);
                
        fenster.pack();// das Fenster wird "gepackt" 
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        fenster.setLocation(d.width/2 - fenster.getWidth()/2, d.height/2 - fenster.getHeight()/2);//das Fenster wird in der mitte des Bildschirmes platziert
        fenster.setVisible(true);//macht das Fenster sichtbar
    }
    
    /**
     * Methode menuezeileErzeugen erzeugt die Menuezeile sowie die einzelnen Menues.
     * 
     * @ param fenster Variable für das Fenster, um die menuezeile zuzufuegen
     * @ param menue Variable für die Eintraege in der Menuezeile
     * @ param eintrag Variable für die einzelnen Auswahlmöglichkeiten innerhalb eines Menueeintrages
     */
    private void menuezeileErzeugen(JFrame fenster)
    {
        final int SHORTCUT_MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
        
        JMenuBar menuezeile = new JMenuBar();// erzeugt die menuezeile
        fenster.setJMenuBar(menuezeile);// fuegt die menuezeile dem Fenster an
        
        JMenu menue;
        JMenuItem eintrag;
        
        menue = new JMenu("Datei");//erzeugt das menu datei
        menuezeile.add(menue);//fuegt das menu datei an die menuzeile an
        
        eintrag = new JMenuItem("Öffnen...");// ein neuer Eintrag oeffnen fuer das menu datei wird erzeugt
            eintrag.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, SHORTCUT_MASK));// fuer das menu wird die Tastenkombination festgelegt
            eintrag.addActionListener(new ActionListener() {
                               public void actionPerformed(ActionEvent e) { listeAusgebenUnsortiert(); }
                           });// ActionListener fuer das menu
        menue.add(eintrag);// der eintrag wird dem menu datei angefuegt
        menue.addSeparator();// eine Trennlinie wird erzeugt
        
        eintrag = new JMenuItem("Beenden");// ein neuer Eintrag beenden fuer das menu datei wird erzeugt
            eintrag.addActionListener(new ActionListener() {
                               public void actionPerformed(ActionEvent e) { beenden(); }
                           });//ActionListener fuer das menu
        menue.add(eintrag);// eine Trennlinie wird erzeugt
        
        menue = new JMenu("Hilfe");//erzeugt das menu Hilfe
        menuezeile.add(menue);//fuegt das menu datei an die menuzeile an
        
        eintrag = new JMenuItem("Programminformationen");// ein neuer Eintrag Programminformationen fuer das menu Hilfe wird erzeugt
            eintrag.addActionListener(new ActionListener() {
                               public void actionPerformed(ActionEvent e) { zeigeInfo(); }
                           });//ActionListener fuer das menu
        menue.add(eintrag);//fuegt das menu Programminformationen an die menuzeile an
    }   
}
 

c2delegate

Mitglied
In Zeile 159
Java:
studentListe[j] == studentListe[j+1]
was hast du mit dem Vergleich vor? Du willst doch nach dem Alter sortieren, also müsstest du einiges in der Methode ändern. Um z.B. auf das Feld "alter" zuzugreifen wäre studentListe.getAlter() (falls dein getter so heisst) nötig.
 

babuschka

Top Contributor
Hej C2delegate,

die Idee hatte ich auch schon... dann hat mir der Compiler allerdings einen Fehler rausgespuckt.
-cannot find symbol method getalter...
Die Methode soll wie gesagt nach Alter, step by step sortieren.
Ist mal ein Versuch, heisst keineswegs dass dies der richtige weg ist...
hast du ev. eine andere idee wie ich "step by step" hinkriege?
ich bin trotz viel rumsurfen nicht wirklich auf die zündende Lösung gekommen
und hänge letztlich am Bubblesort fest...
 

c2delegate

Mitglied
Welche Methoden bietet dir die Klasse Student an?
Es sollte einen getter für das Feld alter geben, immerhin existiert ein setter.

Sonst vergleichst du dann einfach die größe des Feldes eines Objektes, in diesem Falle von Student.
studentenListe.getAlter()>studentenListe[i+1].getAlter() .....

(uups hatte nen tippfehler)

ansonsten findest zu diesem algorithmus viel bei google, da es der einfachste sortieralgorithmus ist, welchen jeder mal durchmachen muss :)
Bubblesort ? Wikipedia
 
Zuletzt bearbeitet:

babuschka

Top Contributor
Hej,
ja, getter und setter hab ich im "Student" fürs Alter...
und vor lauter Bäumen sieht man mal wieder den Wald nicht...
danke für den Hinweis ".getAlter" HINTER die [] zu setzen... ich habs nicht mal geschafft
den eigenen code wieder zu verwenden, weiter oben hats ja sogar schon so geklappt... :oops:
Nun sagt der mir aber der Compiler "incompatible types" und markiert genau die klammer hinter getAlter... hmm...
den Bubblesort- wiki-eintrag hab ich gelesen, mir scheint das auch alles recht easy, nur die implementierung
in mein eigenes Programm happert... das ganze sollte ja dann auch in der Ausgabe noch einigermassen daher kommen...
 

babuschka

Top Contributor
Hej bERt0r,

das wär natürlich am besten wenn ich das gleich mit dem bestehenden comparator hinkrieg, aber wie
bring ich dem bei, step by step zu arbeiten?
nicht zuletzt würde das den gesamten Code etwas vereinfachen...
Hast du mir einen Tipp wie ich die step by step ausgabe auf meine Ausgabefläche "workspace" krieg?
Oder einen Tipp wo ich was nützliches nachlesen kann?
Schonmal danke im voraus!
 

bERt0r

Top Contributor
Wie du willst graphisch den sortiervorgang angezeigt bekommen?
Mit dem Comparator verwenden meinte ich natürlich beim vergleichen zweier Studenten in deinem Sort, dafür sind Comparatoren ja da.
 

babuschka

Top Contributor
Hej,
Ja, ich hab ja bereits eine sortierung nach alter mithilfe eines comparators. (zeile 105)
Ich möchte zusätzlich eine sortierung step by step integrieren, wenn möglich grafisch unterstützt.
zurzeit läuft die Ausgabe in Listenform auf einer JTextArea.
Was ich eben nicht hinkrieg ist das sortieren step by step...
 

bERt0r

Top Contributor
Dann verstehst du nicht was ein Comparator ist.
prozedur bubbleSort( A : Liste sortierbarer Elemente )
n := Länge( A )
wiederhole
vertauscht := falsch
für jedes i von 1 bis n - 1 wiederhole
falls A[ i ] > A[ i + 1 ] dann <---- Hier Comparator aufrufen
vertausche( A[ i ], A[ i + 1 ] )
vertauscht := wahr
ende falls
ende für
n := n - 1
solange vertauscht und n > 1
prozedur ende
Übrigens: wie stellst du dir das vor "step by step" sortieren??? Das sortieren geht so schnell, da kriegst du mit bloßem Auge sowieso nix mit. Wenn du da Zeilen hin und herschieben willst, braucht das graphische mehr Zeit als die Sortierung.
 

babuschka

Top Contributor
Hej,
ich bin Anfängerin, ich hab den Comparator erst einmal verwendet aber ich denke doch grundlegend verstanden zu haben worum es geht...
Dass das sortieren superschnell vonstatten geht is mir auch klar trotzdem möchte ich den vorgang grafisch darstellen...
Mit step by step stell ich mir vor, jeweils jeden Durchgang per "Knopfdruck" anzuwählen,
zb. wie hier: (oder mit einer Scrollbar od. ähnlichem...)
Sort Applet
vielen Dank...
 

bERt0r

Top Contributor
Uiuiui, da solltest du als Anfängerin mal vorerst die Finger davon lassen. Sowas ist gar nicht so trivial, wie es auf den ersten Blick aussieht.
 

babuschka

Top Contributor
Und wenn ich's doch versuchen will?
wenn's schonmal irgendwo gescheite literatur gibt ( am liebsten im web... :) )
könnt ich mir da selber ein bild von machen und gucken ob ich das versteh oder noch ein
bisschen mit warten sollte...
 

jgh

Top Contributor
hier mal ein Beispiel, wie bei deinem Code die Step für Step Anweisung aussehen könnte. Das grafisch zu realisieren ist sicherlich kein Hexenwerk...aber kostet ein wenig Zeit.
Ich habe hier einfach deine BubblesortMethode als Möglichkeit dafür genommen und ein wenig geändert. Ist natürlich noch zu verfeinern, aber mal als Ansatz...

[java=129]public void bubbleSort() {
Student tmp;
int i, j;
int n = 5;
workspace.setText("");
for (i = 0; i < n - 1; i++) {
workspace.append("For-Schleife mit i= " + i + "\n");
for (j = 0; j < n - i - 1; j++) {
workspace.append("\tFor-Schleife mit j= " + j + "\n");
if (studentListe[j].getAlter() > studentListe[j + 1].getAlter()) {
tmp = studentListe[j];
studentListe[j] = studentListe[j + 1];
studentListe[j + 1] = tmp;
workspace.append("\t\tIn der If-Verzweigung werden "
+ studentListe[j].getName() + " und "
+ studentListe[j + 1].getName()
+ " wegen des Alters " + studentListe[j].getAlter()
+ " / " + studentListe[j + 1].getAlter()
+ " getauscht." + "\n");
}
}
}
}[/code]
 

babuschka

Top Contributor
Suuuper!
Herzlichen Dank! jetzt hab ich endlich kapiert wo's bei mir gehapert hat... :)
Falls ich noch weitere Fragen haben sollte werde ich mich nochmals melden... :)
Vielen DANK !!! :toll:
 

bERt0r

Top Contributor
Naja, das ist dann aber eher ein Logging als eine graphische Darstellung. Damit man das so schön sieht wie in dem Applet aus deinem Link muss man die Grundkenntnisse im Zeichnen mit Swing draufhaben.
Wenn du die Werte nur in einer JList anders anordnen willst geht das vielleicht einfacher:
Da brauchst du am besten eine Klasse SteppedBubbleSort der du deine Studenten, sowie deinen Comparator übergibst. Die Klasse hält zwei Membervariablen i und j (für die 2 Schleifen) und eine Methode doStep(); in doStep überprüfst du dann i und j, zählst bei der richtigen variable 1 dazu und machst deine Sortierung. In der JList aktualisierst du das Model.
 

c2delegate

Mitglied
alternativ rate ich dir hierbei mal den debugger zu benutzen, da kannst du immer schritt für schritt gehen und siehst was für werte in welcher variable drin sind usw. :D

debugger wird später eh dein bester freund werden, so wie ein gut durchdachtes logging !
 

stikio

Mitglied
nettes progrämmchen, damit können anfänger ziemlich gut sehen wie die sorts funktionieren :) perfekt zum üben von hand mit stift und papier und zur kontrolle ;-)
 

babuschka

Top Contributor
solche Weihnachtsgeschenke find ich super!
Herzlichen Dank!
Das vereinfacht doch einiges, auch wenn ich mich da erstmal gründlich durchackern muss... :)
 

Neue Themen


Oben