Wie kann man in einer JList sortieren?

Nico2201

Mitglied
Hallo,

ich bin dabei 3 verschiedene Sortierungsmethoden in mein Projekt in implementieren. Und zwar soll bei der ersten Methode nach den Namen (String), bei der zweiten nach dem Preis (double) und bei der dritten Methode nach dem Datum (unbekannter Wert - vermutlich Date oder sowas?) sortiert werden. Das ganze soll auf einer JList funktionieren. Im Internet habe ich etwas von einem Comparator gelesen, aber um ehrlich zu sein wurde ich da nicht schlauer draus.

Kann mir bitte jemand bei den Sortierungsmethoden helfen? Die dazugehörigen Codes mit Erklärung wäre perfekt. :cool:
 
Lösung
Moin,
Also ist Datum in deiner Entity ein String?
ja, scheint so, da es ja scheinbar funktioniert!

Noch ein Tipp am Rande:
nimm' immer "sprechende Bezeichner"!!
Sonst fliegt Dir möglicherweise sowas hier
Java:
try 
{
    br = new BufferedReader(new FileReader(datei));
    int value = Integer.parseInt(br.readLine());
    for( int i = 0; i < value; i++ )
    {
        String[] s = br.readLine().split("-", 3);   // 's' lokal als Stringarray !!
        String name = s[0];
        String sPreis = s[1];
        String datum = s[2];
        double preis = Double.parseDouble(sPreis);
        model.addElement(new Entity(name, preis, datum));
    }
    liste.setModel(model);
    String s = br.readLine();    // 's' als String...
Sorry wenn ich das so sage, aber das sieht wie zusammenkopiert und nicht verstanden aus ;-)
Java:
int value = Integer.parseInt(br.readLine());
Soll vermutlich die Anzahl der folgenden Einträge sein. Grundsätzlich ok. Du brauchst die while-Schleife nicht mehr. Dann ist aber text deine komplette Zeile. Das muss dir klar sein. Deine Hürde ist dann die einzelnen Werte aus der Zeile zu lesen und zu parsen. Die interpretierten Werte gibst du dann der Entity.
 
Sorry wenn ich das so sage, aber das sieht wie zusammenkopiert und nicht verstanden aus ;-)
Zugegeben: Teilweise ja, aber nicht alles.

Die while-Schleife habe ich entfernt und bin auch verschiedene Varianten beim Parsen durchgegangen, aber ohne Erfolg. Jedes mal kommt folgende Fehlermeldung:

Java:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "e-45.0-4.0"
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
    at java.lang.Double.parseDouble(Unknown Source)
    at ausgabenrechner.Ausgabenrechner.DateiOeffnen(Ausgabenrechner.java:306)
    at ausgabenrechner.Ausgabenrechner$3.actionPerformed(Ausgabenrechner.java:99)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.AbstractButton.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Fällt dir vielleicht was ein? Ich bin dabei ziemlich am verzweifeln. :(
 
Ich hoffe, ich habe das richtig verstanden, was du meinst..

Es handelt sich um eine Text-Datei (*.txt):

1
Beispiel-100.0-5072018.0
Ihre Ausgaben: 100.0€

Das Speichern funktioniert einwandfrei, aber das Öffnen ist das Problem. Hier die Fehlermeldung dazu:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "Beispiel-100.0-5072018.0"
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
at ausgabenrechner.Ausgabenrechner.DateiOeffnen(Ausgabenrechner.java:306)
at ausgabenrechner.Ausgabenrechner$3.actionPerformed(Ausgabenrechner.java:99)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 
Moin,
die Fehlermeldung ist doch eindeutig:
java.lang.NumberFormatException: For input string: "Beispiel-100.0-5072018.0"

sie tritt hier auf
at ausgabenrechner.Ausgabenrechner.DateiOeffnen(Ausgabenrechner.java:306)
wobei ich mal auf diese Zeile tippen würde:
int value = Integer.parseInt(br.readLine());

Vermutlich wird hier der o. g. String geparst, aber er enthält eben nun mal keinen Integer!

Du könntest den String "Beispiel-100.0-5072018.0" (so er denn immer gleich aufgebaut ist) ggf. nach dem '-' splitten und die Teile '100.0' und '5072018.0' einzeln in Zahlen umwandeln. Allerdings auch nicht in Integer, da es keine Interger sind und hierbei der Punkt stört
http://javatricks.de/tricks/string-in-int-umwandeln

VG Klaus
 
Du könntest den String "Beispiel-100.0-5072018.0" (so er denn immer gleich aufgebaut ist) ggf. nach dem '-' splitten und die Teile '100.0' und '5072018.0' einzeln in Zahlen umwandeln. Allerdings auch nicht in Integer, da es keine Interger sind und hierbei der Punkt stört

Mit Splitten habe ich bis jetzt nur wenig zu tun gehabt, aber ich habe mich hingesetzt, eine Testmethode geschrieben, um zu sehen wie das ganze funktioniert und dann habe ich diese Methode auf meine "DateiOeffnen"-Methode übertragen und auch dementsprechend angepasst:

Java:
public void DateiOeffnen(ActionEvent e) {
        
        JFileChooser fcOeffnen = new JFileChooser();
        
        if(fcOeffnen.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
            
            File datei = fcOeffnen.getSelectedFile();
            
            try {
                
                br = new BufferedReader(new FileReader(datei));
                int value = Integer.parseInt(br.readLine());
                
                for(int i = 0; i < value; i++) {
                    
                    String[] s = br.readLine().split("-", 3);
                    String name = s[0];
                    String sPreis = s[1];
                    String datum = s[2];
                    double preis = Double.parseDouble(sPreis);
                    model.addElement(new Entity(name, preis, datum));
                }
                
                liste.setModel(model);
                String s = br.readLine();
                ausgabePreis.setText(s);
            }
            
            catch(IOException e1) {
                
                JOptionPane.showMessageDialog(null, "Die Liste konnte nicht geöffnet werden. Bitte versuchen Sie es erneut!", "Öffnen fehlgeschlagen", JOptionPane.WARNING_MESSAGE);
            }
            
            finally {
                
                try {
                    
                    br.close();
                    
                }
                
                catch(IOException e2) {

                    JOptionPane.showMessageDialog(null, "Die Liste konnte nicht geöffnet werden. Bitte versuchen Sie es erneut!", "Öffnen fehlgeschlagen", JOptionPane.WARNING_MESSAGE);
                }
            }
        }
    }

Vielen Dank für eure Hilfe! :)(y)
 
Moin,
Also ist Datum in deiner Entity ein String?
ja, scheint so, da es ja scheinbar funktioniert!

Noch ein Tipp am Rande:
nimm' immer "sprechende Bezeichner"!!
Sonst fliegt Dir möglicherweise sowas hier
Java:
try 
{
    br = new BufferedReader(new FileReader(datei));
    int value = Integer.parseInt(br.readLine());
    for( int i = 0; i < value; i++ )
    {
        String[] s = br.readLine().split("-", 3);   // 's' lokal als Stringarray !!
        String name = s[0];
        String sPreis = s[1];
        String datum = s[2];
        double preis = Double.parseDouble(sPreis);
        model.addElement(new Entity(name, preis, datum));
    }
    liste.setModel(model);
    String s = br.readLine();    // 's' als String
    ausgabePreis.setText(s);
}
eines Tages garantiert um die Ohren!!
Wird der Code größer, ist unklar was 's' semantisch enthält und ob es nun String oder Stringarray ist!

VG Klaus
 
Zurück