Collections Sortieren nach zweiter Spalte in JTable

Kobold137

Mitglied
Hallo Community,

ich habe diesen Code im Internet gefunden und verstehe das Prinzip.

Java:
    public void sortUpAndUpdate(Vector v){
       
         Collections.sort(v, new Comparator() {
                public int compare(Object o1, Object o2) {
    
                    Vector v1 = (Vector) o1;
                    Vector v2 = (Vector) o2;
    
                    int cmp = 0;
    
                    for (int i = 0, size1 = v1.size(); i < size1; i++) {
                        String s1 = (String) v1.get(i);
                        String s2 = (String) v2.get(i);
                        cmp += s1.compareTo(s2);
                    }
                    return cmp;
                }
            });
        
            parent.getTabel().updateUI();
        }

Funktioniert auch soweit nur ich will jetzt nicht die erste Spalte in meiner Tabelle sortiert haben sondern die zweite Spalte. Ja ich weiß das er die zweite Spalte mit der ersten verändert. Ich will aber das die Priorität auf der zweiten liegt. Praktisch variabel. Gibt es irgendwo ein wert den ich ändern kann ?


LG

Kobold
 

Times

Bekanntes Mitglied
Hey,

ich bin mir nicht ganz sicher was dein Code macht ... willst du einfach nach X Spalten in einer JTable sortieren?

Wenn ja, dann kannst du folgendes machen:

Java:
TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
table.setRowSorter(sorter);
List<RowSorter.SortKey> sortKeys = new ArrayList<>();

// Dort wo die 1 steht trägst du die Spalte ein die zu sortiert haben möchtest.
// Kannst auch mehrere von diesen Codezeilen untereinander schreiben, je nachdem wie
// du es sortiert haben möchtest.
sortKeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));


sorter.setSortKeys(sortKeys);
sorter.sort();
 
Zuletzt bearbeitet:

Kobold137

Mitglied
Danke für die schnelle Antwort klappt soweit =)
Muss jetzt nur noch schauen wenn ich die gleiche liste umsortieren will,
sprich wenn ich zuerst nach ASCENDING sortiert habe und danach nach DESCENDING.
Das macht er jetzt noch nicht aber da schau ich erstmal selber.
Danke vielmals =)
 

Kobold137

Mitglied
Jetzt stellt sich mir noch eine Frage.
Der Code funktionier so wie ich das mir vorgestellt habe. Der Algorithmuss sortiert mir aber wenn ich absteigend sage die Zahl 18xx unter 2xx ...
Wie könnte ich das ändern ? Ich will nämlich nicht nur Strings sortieren sondern auch int werte. In diesem Fall zum Beispiel der Stromverbrauch von verschiedenen geräten. Denke der wandelt alles in strings um und sortiert nach und nach. Jemand eine Idee für das Problem?
 

Kobold137

Mitglied
Das muss ich mal ausprobieren und die Daten in der DB ändern.
Hab ich da jetzt was falsch in Errinerung oder löscht int nicht normalerweise die 0er vorne ?
 

stg

Top Contributor
Oder du überschreibst getColumnClass von deinem TableModel, wie es dick und fett mit Warning in der API angemerkt wird!

http://docs.oracle.com/javase/7/docs/api/javax/swing/table/DefaultTableModel.html

Warning: DefaultTableModel returns a column class of Object. When DefaultTableModel is used with a TableRowSorter this will result in extensive use of toString, which for non-String data types is expensive. If you use DefaultTableModel with a TableRowSorter you are strongly encouraged to override getColumnClass to return the appropriate type.
 

JStein52

Top Contributor
In der Datenbank hast du diese Werte ja sicher als Integerzahlen drin stehen die du mit getInt(...); oder so
dann aus deinem ResultSet rausholst. Und danach müsstest du sie mit führenden Nullen auffüllen. Sieht das aber nicht doof aus wenn in deiner Tabelle dann 18xxx , 02xxx usw. drinnen steht ?
 

Kobold137

Mitglied
Das überschreitet jetzt meine Fähigkeiten.
Vorstellen kann ich mir schon was du meinst stg abe umsetzten kann ich es leider nicht.
Könntest du mir vielleich ein kleinen Denk anstoß geben oder es mir zeigen wie man so etwas macht ?


LG

Kobold
 

stg

Top Contributor
So in der Art

Java:
public class MyTableModel extends DefaultTableModel implements TableModel {
    @Override
    public Class<?> getColumnClass(int index) {
        if(index == 2) {  // bzw welchen Index auch immer deine Integer-Spalte besitzt
            return Integer.class;
        } else return Object.class;
    }
}

Wenn du deine Table erstellst, machst du das dann mit
Java:
JTable myTable = new JTable(new MyTableModel());
 

Kobold137

Mitglied
Das Problem was ich dabei seh, ich weiß im Vorfeld nicht welche Spalte integer Werte besitzt.
Da ich mir verschiedene Tabellen anzeigen lassen will, die ja unterschiedliche strukturen aufweisen.
Im Momment erzeuge ich die Tabelle so

Java:
model = new DefaultTableModel(rowData, spaltenNamen);
        tabelle = new JTable(model);

dabei ist rowDate ein mehrDimensionales String Array.
SpaltenNamen ist ein normales StringArray, dass die Header sozusagen mitgibt.
 

Times

Bekanntes Mitglied
Ich fantasiere mal ein wenig...

Holst du deine Daten aus einer Datenbank? Wenn du dir das ganze schön aufbaust sodass die Datenbank direkt mit der Tabelle "kommuniziert" :D, kannst du in der Tabelle, bzw. beim erzeugen herausfinden lassen welche Spalten Integer sind und welche nicht. Kannst du alles über die metadata herausfinden.

Andernfalls, arbeitest du nicht mit einer Datenbank? Musst du dir selber eine Möglichkeit überlegen wie du es herausfinden könntest, aber das wäre meiner Meinung nach aus der richtige Lösungsweg.

So könntest du bei initialisieren deines TableModels die Tabellendaten mit übergeben - sprich die Daten und Meta Informationen und dein eigenes TableModel bastelt sich dann aus diesen Dingen selber ein optimales Model zusammen.

Datentypen über die MetaData herausfinden:
Java:
// Die 1 gibt die Spalte an.
metaData.getColumnType(1);

Hierbei wirst du feststellen das du jede Menge verschiedener Datentypen zurückbekommen kannst. Ich habe mir hierfür eigene eigene Funktion erstellt, welche mir für die verschiedenstens Datenbank-Datentypen die zugehörigen Java-Datentypen zurückgibt, aber das bleibt jedem selber überlassen.
 

JStein52

Top Contributor
Wäre das eine Möglichkeit (ich weiss, du hast schon Versuche mit sorter und comparator gemacht, aber was genau geht denn daran nicht?) :


Java:
        // Der TableRowSorter wird die Daten des Models sortieren
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>();

        // Der Sorter muss dem JTable bekannt sein
        tabelle.setRowSorter(sorter);

        // ... und der Sorter muss wissen, welche Daten er sortieren muss
        sorter.setModel(model);  // könnte auch vorher im Konstruktor mitgegeben werden

        // nun einen eigenen Comparator definieren der die gewünschte Spalte sortiert. Hier Integer
        // du könntest ja nun hier noch den Typ der Spalte dynamisch bestimmen und einen passenden
        // Komparator aussuchen, genau so die Spalte für die du das machen willst

        sorter.setComparator( 7, new Comparator<String>() {  // hier Spalte 7
        @Override public int compare( String s1, String s2 ) {
            int  i1 = Integer.parseInt( s1 ), i2 = Integer.parseInt( s2 );
            return i1-i2;
            }
        } );
 

Kobold137

Mitglied
Ja ich beziehe meine Daten aus einer Datenbank.
Danke für die Antworten und für den Tollen Tipp mit den MetaDaten.
Da ich noch anfänger bin kenn ich einfach bestimmte grundlagen noch nicht.
@JStein52 Ich weiß nicht ob dies funktionieren würde und ich bin auch davon abgeneigt mein ganzen Code umzubasteln. Da es mein erstes richtiges Programm wird und schon über 1000 Zeilen hat. (Vielleicht nich viel: Für mich schon)

Trozdem Danke für die Hilfe!

PS: Die MetaDaten schau ich mir gleich mal an !
 

Kobold137

Mitglied
Also ich habe jetzt gesucht und gesucht und nichts (auch nicht im Internet) über das Wunder metaData gefunden. Muss ich mir die Variable anlegen (wenn ja welcher Typ) und über welchen pfad muss ich gehen um diese Variable zu füllen?

PS: wenn du meinen gesammten Code haben willst geb ich ihn dir auch gerne, damit du drüber schauen kannst, dabei musst du aber 10 Augen dir zuhalten (Formatierung,Kommentare,etc *grins*)

LG

kobold
 

Times

Bekanntes Mitglied
Hehe, ja entweder so oder:

Dort wo du deine Daten aus der Datenbank holst. Dort bekommst du ja ein ResultSet zurück.
Und an diesem Resultset kannst du die Methode getMetaData() aufrufen, welche dir dann HeaderInformationen und allgemeine Tabelleninformationen wiedergeben kann.

Desweiteren kannst du auch an der Datenbankverbindung getMetaData() aufrufen um dir Metadaten der gesamten Datenbank zu holen, wie zB Primärschlüssel herausfinden für automatische ... Abfolgen oder so.

Falls du nicht weiterkommst, dann kannst du mir auch eine PN mit dem Code schicken, falls du ihn nicht offen preisgeben magst.

Grüße
 

JStein52

Top Contributor
Beiträge sind hier völlig umsonst und ohne Verpflichtung. :) Und beides ergänzt sich ja. Wenn du aus den Metadaten weisst um was es sich da handelt musst du ja trotzdem noch korrekt sortieren.
 

Kobold137

Mitglied
Vielen Lieben Dank!

Die Information (wo ich getMetaData() drauf wenwenden muss) habe ich gesucht.

Ich werde jetzt auf jeden Fall erstmal wieder selbst herumprobieren.
Fragen die aufkommen werden hier ja wunderbar beantwortet =)
 

Sven.S.K

Neues Mitglied
Hallo zusammen,

ich habe auch das Problem, dass ich eine komplette Tabelle anhand der Daten, die in der zweiten Spalte stehen, sortieren möchte.
Ich habe schon viel recherchiert und ausprobiert, aber meine Tabelle wird nicht sortiert.
Es wird immer die unsortierte Tabelle angezeigt.
Im Anhang habe ich ein Ausschnitt der Tabelle, die x- und y-Koordinaten und die Labels enthält für die Punkte. Die Daten sind im vorraus aufsteigend der Labels sortiert, aber ich will die Tabelle nach den x-Koordinaten umsortieren.
Ich weiß leider in diesem Punkt nicht mehr weiter und vielleicht hat ja jemand eine Lösung für mein Problem.

Die Daten selbst kann man unter folgendem Link finden.

http://i11www.iti.uni-karlsruhe.de/map-labeling/general/

366 German railway stations

Hier meine Funktion zum erstellen der Tabell und dem sortieren.

Code:
public void setTable()
   {
     this.title.add("Label");
     this.title.add("x");
     this.title.add("y");
     
     TableModel model = new DefaultTableModel(data,title);
     PriorityLabeling.this.table = new JTable(model);

     TableRowSorter<TableModel> rowSorter = new TableRowSorter<TableModel>();
     table.setRowSorter(rowSorter);
     rowSorter.setModel(model);
     
     rowSorter.setComparator(1, new Comparator<String>() {
       
       @Override public int compare (String s1 , String s2)
       {

        int i1 = Integer.parseInt( s1 );
        int i2 = Integer.parseInt( s2 );
        return  i1  -  i2 ;   
         
       }
       
     });

     JFrame frame = new JFrame( "Demo" );
     frame.getContentPane().add( new JScrollPane( table ) );
     frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
     frame.pack();
     frame.setVisible( true );

   }

Die Daten selbst habe ich über diese Funktion ausgelesen.

Code:
public void getData(){
     File myData = null;
     FileReader fileReader = null;
     BufferedReader reader = null;
     String text = null;

     try{
       myData      = new File("C:/Users/Sven S. Kraft/Documents/SoftwareProjekt/german_railway_366.txt");
       fileReader    = new FileReader(myData);
       reader      = new BufferedReader(fileReader);
     }
     catch(FileNotFoundException ex)
     {
       System.out.println("File not found!");
     }   

     try{
       while((text = reader.readLine()) != null)
       {
         String[] tokens = text.split(" ");

         Vector<Object> row = new Vector<Object>();
         
         row.add(tokens[2]);
         row.add(Double.parseDouble(tokens[0]));
         row.add(Double.parseDouble(tokens[1]));
                 
         data.add(row);         
       }
     }

     catch(IOException ex)
     {
       ex.printStackTrace();
     }

     try
     {
       reader.close();
     }

     catch (IOException e)
     {
       e.printStackTrace();
     }
   }
 

Anhänge

  • Tabelle.jpg
    Tabelle.jpg
    83,8 KB · Aufrufe: 34
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
Jambolo Karten sortieren nach Rang und Farbe Java Basics - Anfänger-Themen 5
rosima26 Java nach letzter Ziffer sortieren Java Basics - Anfänger-Themen 19
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
C ArrayList sortieren nach bestimmten Buchstaben in den Wörtern Java Basics - Anfänger-Themen 13
javaluke Erste Schritte Array nach Datentyp sortieren Java Basics - Anfänger-Themen 16
O 2D-Array nach einer Spalte sortieren Java Basics - Anfänger-Themen 22
P Sortieren von Listen nach Attributen Java Basics - Anfänger-Themen 3
B Wie kann ich die Buchstaben sortieren nach der Höhe der Zahlen Java Basics - Anfänger-Themen 14
F Liste nach einer Variablen sortieren Java Basics - Anfänger-Themen 6
L (Integer) Liste nach aufsteigender Summe der Ziffern sortieren (mit Bedingung) Java Basics - Anfänger-Themen 8
F Interface Nach mehreren Kriterien sortieren Java Basics - Anfänger-Themen 2
I Sortieren nach Priorität Java Basics - Anfänger-Themen 3
C JList Einträge nach Datum sortieren Java Basics - Anfänger-Themen 3
O Erste Schritte TreeMap nach Value sortieren Java Basics - Anfänger-Themen 2
J Liste der Größe nach sortieren Java Basics - Anfänger-Themen 2
S Listen Objekte nach LocalDateTime sortieren Java Basics - Anfänger-Themen 2
J Array nach häufigkeit sortieren Java Basics - Anfänger-Themen 4
S Strings im Array nach Namen sortieren Java Basics - Anfänger-Themen 11
S String nach Größe sortieren Java Basics - Anfänger-Themen 6
P Liste nach Datum sortieren Java Basics - Anfänger-Themen 7
J Strings nach Teile sortieren Java Basics - Anfänger-Themen 4
G mache aus Test nach sortieren estt oder java aajv Java Basics - Anfänger-Themen 5
G 2 Listen kombinieren und nach abc sortieren Java Basics - Anfänger-Themen 9
L 3 Zahlen einlesen und nach der Größe Sortieren Java Basics - Anfänger-Themen 5
V Methoden Zeilen nach bestimmtem Attribut sortieren Java Basics - Anfänger-Themen 4
B Array nach dem Alphabet sortieren Java Basics - Anfänger-Themen 11
R Usereingabe nach parität sortieren - Bug bei der Ausgabe Java Basics - Anfänger-Themen 4
W ArrayList nach Wunsch sortieren Java Basics - Anfänger-Themen 4
S Collections Sortieren von 3 Collections nach "einer Sortierung" Java Basics - Anfänger-Themen 3
Bastie Strings nach häufigkeit sortieren -aber wie? Java Basics - Anfänger-Themen 10
L verschachteltes ArrayList nach Geburtsdatum sortieren Java Basics - Anfänger-Themen 4
V ArrayList Sortieren nach Double funktioniert nicht Java Basics - Anfänger-Themen 3
R ArrayList nach Strings sortieren Java Basics - Anfänger-Themen 6
J Arrayliste (gefüllte mit arrays) nach datum sortieren Java Basics - Anfänger-Themen 3
J Sortieren nach Auswahl Java Basics - Anfänger-Themen 3
babel einen Vector nach Datum sortieren Java Basics - Anfänger-Themen 21
D Array nach ungerade zahlen sortieren Java Basics - Anfänger-Themen 6
D String nach ABC sortieren Java Basics - Anfänger-Themen 2
G ArrayList mit Objeken nach Wert sortieren Java Basics - Anfänger-Themen 7
J matrix nach summe der spalten sortieren Java Basics - Anfänger-Themen 5
B Sortieren von Objekt Arrays nach einer Instanz Java Basics - Anfänger-Themen 8
G Datenstruktur [int id, int wert] nach wert sortieren? Java Basics - Anfänger-Themen 5
G Liste mit Artikeln nach ID sortieren Java Basics - Anfänger-Themen 6
S Arrays nach String kovertieren und sortieren Java Basics - Anfänger-Themen 4
S Nach Namen sortieren und diese in 3 Gruppen aufteilen Java Basics - Anfänger-Themen 16
G ArrayList<Map.Entry.> nach den Values sortieren? Java Basics - Anfänger-Themen 8
C ArrayListen in einer ArrayList der Grösse nach sortieren Java Basics - Anfänger-Themen 5
S array nach 2 kriterien sortieren Java Basics - Anfänger-Themen 3
Bierhumpen Arraywerte der größe nach sortieren Java Basics - Anfänger-Themen 5
M Integer Objekte nach Größe in einem Vector sortieren. Java Basics - Anfänger-Themen 2
G elemente in einem vektor nach ihren eigenschaften sortieren Java Basics - Anfänger-Themen 2
M Sortieren eines Strings nach Alphabet Java Basics - Anfänger-Themen 4
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
S Daten aus Import Datei auslesen und sortieren Java Basics - Anfänger-Themen 2
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
O Sortieren mit Insertion Sort Java Basics - Anfänger-Themen 3
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
K verschiedene Eingaben sortieren Java Basics - Anfänger-Themen 6
G zweidimensionales int Array sortieren Java Basics - Anfänger-Themen 57
K Java sortieren. Java Basics - Anfänger-Themen 7
D Array Elemente sortieren in aufsteigender Reihenfolge Java Basics - Anfänger-Themen 10
J Tabelle Sortieren Java Basics - Anfänger-Themen 48
L Sortieren Java Basics - Anfänger-Themen 1
C Wie 2 Arrays zusammenfügen und sortieren? Java Basics - Anfänger-Themen 11
C Sortieren einer ArrayList Java Basics - Anfänger-Themen 2
A Teilarrays eines 2D-Arrays sortieren Java Basics - Anfänger-Themen 4
JD_1998 Random Array sortieren mit Hilfe einer Methode Java Basics - Anfänger-Themen 4
java3690 eine liste sortieren Java Basics - Anfänger-Themen 12
DorFey Sortieren eines mehrdimensionalen Arrays Java Basics - Anfänger-Themen 8
W Personen sortieren mit Comparator Java Basics - Anfänger-Themen 9
U Objekte in einer LinkedList sortieren Java Basics - Anfänger-Themen 5
B HashMap alphabetisch sortieren Java Basics - Anfänger-Themen 2
S Streams - Abfrage absteigend sortieren Java Basics - Anfänger-Themen 11
V Collections ArrayList mit Comparator sortieren Java Basics - Anfänger-Themen 16
V Collections int Werte in einer Liste sortieren Java Basics - Anfänger-Themen 23
L Array sortieren Java Basics - Anfänger-Themen 4
L Java Int-Array, Zahlen sortieren Java Basics - Anfänger-Themen 8
T Java: Array monat absteigend sortieren? Java Basics - Anfänger-Themen 1
B Liste sortieren? Java Basics - Anfänger-Themen 4
P Array Sortieren mit boolean? Java Basics - Anfänger-Themen 33
scratchy1 Array sortieren und dann String-Repräsentation ausgeben Java Basics - Anfänger-Themen 2
O Arrays sortieren in einer Methode Java Basics - Anfänger-Themen 2
E Methoden 2 Arrays sortieren (MergeSort) Java Basics - Anfänger-Themen 3
B Suchen und sortieren Java Basics - Anfänger-Themen 10
F Zahlen im Feld sortieren + Unterprogramm Java Basics - Anfänger-Themen 4
O Zweidimensional Array sortieren Java Basics - Anfänger-Themen 14
J Liste,Queue,Stack sortieren Java Basics - Anfänger-Themen 2
CptK Variablen Teile eines Arrays zufällig sortieren Java Basics - Anfänger-Themen 7
K Methoden Array[][] sortieren Java Basics - Anfänger-Themen 30
CptK Datentypen Integer ArrayList sortieren Java Basics - Anfänger-Themen 2
E ArrayList sortieren Java Basics - Anfänger-Themen 16
L Methode zum sortieren Java Basics - Anfänger-Themen 1
L Methode zum sortieren Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben