Sortierproblem

Status
Nicht offen für weitere Antworten.
Hallo

ich hab hier n Problem...das Program besteht aus einem eingabefeld 15 kleine eingabefelder für zahlen die automatisch hineinkommen und ein button. Nachdem die Zahlen in den 15 eingabfeldern gekommen sind werden die Zahlen sortiert. Dann wird eine Zahl eingegeben im eingabefeld die dann in das geordnete 15er feld kommen soll.

Es wird zuerst nach der Stelle gesucht in der die Zahl hineinpasst.

Code:
  public void bEinfuegen2ActionPerformed(ActionEvent evt) {
    int links = 0;
    int rechts = elemente;
    int zahl = eingabe();
    if (elemente != feld.length) {
      while (links != rechts) {
        int mitte = (links + rechts) / 2;
        if (zahl > feld[mitte]) {
          links = mitte + 1;
        } else {
          rechts = mitte;
        }
      }


Dann sollen die Zahlen nach rechts verrückt werden und die eingegebene Zahl in das gefundene Feld (siehe Quelltext 1) eingesetzt werden.
Code:
      for (int i = elemente; i >= links; i--) {
        feld[i + 1] = feld[i];
        elemente++;
      }
      feld[links] = zahl;
      ausgeben();
    } else {
      tfEingabe.setText("Feld ist voll!");
    }
  }

Leider funktioniert der 2. quellcode nicht....könnt ihr mir da helfen! VIELEN DANK!!!!
 
B

bygones

Gast
sry ich versteh nicht wie was in welche felder kommen soll.....

ah ne... jetzt glaub ich.

halt die ersten Zahlen doch in einer Datenstruktur (array, list). füge die neue zahl der struktur hinzu, lass java sortieren (arrays.sort, Collections.sort) und schreibs dann wieder in die felder
 
Wenn ich aber die Zahl in das richtige Feld einfüge dann verschwindet die Zahl die davor drin war.

Ich muss also zuerst die Zahlen nach rechts rücken und dann die Zahl einfügen...aber wie?

Beispiel

Feld
feld[0]feld[1]feld[2]feld[3]feld[4].....feld[15]
14 17 29 30 40

5 Elemente


Ich will die Zahl 15 einfügen und zwar zwischen 14 und 17

also muss ich die Zahlen in feld[1] bis feld[4] um 1 feld nach rechts rücken.

erst dann kann ich die Zahl 15 einfügen.
 
B

bygones

Gast
wie gesagt ich würds in etwa so machen:

array mit 15 elementen. Immer wenn eine neue Zahl kommt wird array sortiert und eine methode aufgerufen, die dann den array durchläuft und die werte in die Felder schreibt.

Wenn du es komplizierter machen willst:
sortieralgorithmus durchlaufen und den index merken an welcher stelle eingefügt werden soll. Dann alle elemente index + 1 verschieben und dann neue zahl reinschreiben
 

sliwalker

Top Contributor
MasterInfinite hat gesagt.:
Code:
  public void bEinfuegen2ActionPerformed(ActionEvent evt) {
    int links = 0;
    int rechts = elemente;
    int zahl = eingabe();
    if (elemente != feld.length) {
      while (links != rechts) {
        int mitte = (links + rechts) / 2;
        if (zahl > feld[mitte]) {
          links = mitte + 1;
        } else {
          rechts = mitte;
        }
      }

Der Algorithmus funktioniert?
Hab nur ein Beispiel gerechnet. Und zwar elemente = 5 --> mitte = (0 + 5)/2 = 2,5 ---> feld[2,5] ? oO
Warum kein BubbleSort oder ähnliches?

MasterInfinite hat gesagt.:
Code:
      for (int i = elemente; i >= links; i--) {
        feld[i + 1] = feld[i];
        elemente++;
      }
      feld[links] = zahl;
      ausgeben();
    } else {
      tfEingabe.setText("Feld ist voll!");
    }
  }
Schreib doch mal bitte wo Du elemente her kriegst. Was für eine fehlermeldung bekommst Du eigentlich?
IndexoutOfBounds? :)

Ansonsten ist die erste Idee meines Vorredner die Beste.

greetz
SLi
 

André Uhres

Top Contributor
Code:
        ...
    //feld[] mit den 15 JTextFields erzeugen:
    private JTextField feld[] =  new JTextField[15];
    ...
        //Init: Die 15 JTextFields aus dem feld[] zur Anzeige bringen:
        for (int i = 0; i < feld.length; i++) {
            feld[i] = new JTextField("");
            feld[i].setPreferredSize(new Dimension(20,20));
            feld[i].setBackground(new Color(255,255,204));
            feld[i].setEditable(false);
            panel2.add(feld[i]);
        }
        getRootPane().setDefaultButton(bEinfuegen2);//Button = Eingabetaste 
        ...
    private int elemente = 0;
    private void bEinfuegen2ActionPerformed(ActionEvent evt) {
        int links = 0;
        int rechts = elemente;
        int zahl = 0;
        try{zahl = Integer.parseInt(tfEingabe.getText());}catch(NumberFormatException ex){}
        if (elemente != feld.length) {
            while (links != rechts) {
                int mitte = (links + rechts) / 2;
                if (zahl > Integer.parseInt(feld[mitte].getText())) {
                    links = mitte + 1;
                } else {
                    rechts = mitte;
                }
            }
            for (int i = elemente; i >= links; i--) {
                if(i < feld.length-1){
                    feld[i + 1].setText(feld[i].getText());
                }
            }
            feld[links].setText(""+zahl);
            elemente++;
        } else {
            tfEingabe.setText("Feld ist voll!");
        }

        tfEingabe.selectAll();//das Eingabefeld ist sofort überschreibbar
    }
    ...

[Edit Andre_Uhres: Geändert am: 31. 10. 2005, 7:10]
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben