Sortieren und Filtern von Tabellen

Boboline

Mitglied
Hallo 🙂
Wir müssen für die Schule ein Programm erstellen, das quasi einen DVD-Verleih simuliert. Wir haben allerdings noch nicht verstanden, wie man die Tabelle, in der die DVDs sich befinden, sortieren oder filtern kann. Also z.B. nach Erscheinungsjahr etc. Wir haben dazu auch schon viel im Internet gesucht, aber so wirklich schlau sind wir daraus geworden. Hier ist mal das, was wir bisher haben:
Java:
import javax.swing.*;

public class Tabelle
{
  public static void main( String[] args )
  {
    String[][] rowData = {
    { "Interstellar", "2014", "Science-Fiction", "12" }, { "Who Am I", "2014", "Thriller" , "12" }, { "Ruhet in Frieden", "2014", "Action", "16" },
    { "Nightcrawler", "2014", "Thriller", "16" }, { "Ich darf nicht schlafen", "2014", "Thriller", "12" } ,{ "Dritte Person ", "2013", "Drama", "12" },
    { "Automata", "2014", "Science-Fiction", "12" }, { "Paddington", "2014", "Kids", "0" },
    { "Outcast", "2014", "Action", "16" }, { "The Homesman", "2014", "Western", "16" },
    { "Maze Runner", "2014", "Science-Fiction", "12" }, { "The Cut", "2014", "Abenteuer", "12" }, { "The Mummy Resurrected", "2014", "Horror", "16" },
    { "Am Sonntag bist du tot", "2014", "Krimi", "16" }, { "Die Boxtrolls", "2014", "Animation", "6" } ,{ "In the Blood ", "2014", "Action", "18" },
    { "Diary of the Dead", "2007", "Horror", "18" }, { "Schwarze Schafe", "2006", "Komödie", "18" },
    { "Geliebte Clara", "2008", "Musik", "6" }, { "Zeiten ändern dich", "2009", "Musik", "12" },
    { "Fit for Fun - FatburnerWorkout", "2008", "Ratgeber", "0" }, { "Fitness für faule Säcke", "2003", "Ratgeber", "0" }, { "Hin und Weg", "2014", "Drama", "12" },
    { "Love, Rosie", "2014", "Lovestory", "6" }, { "Die Biene Maja - Der Kinofilm", "2014", "Kids", "0" } ,{ "Gravity", "2013", "Science-Fiction", "12" },
    { "Die Eiskönigin - Völlig unverfroren", "2013", "Kids", "0" }, { "Non-Stop", "2014", "Thriller", "12" },
    { "Free Birds", "2013", "Animation", "6" }, { "Das Salz der Erde", "2014", "Dokumentation", "12" },
    { "Sarkar", "2005", "Bollywood", "16" }, { "Scarlett", "1994", "Lovestory", "12" }, { "Fack ju Göhte", "2013", "Komödie", "12" },
    { "Faszination Indien", "2010", "Dokumentation", "0" }, { "Hornblower", "1998", "Kriegsfilm", "12" } ,{ "American Gothic", "1995", "Serie", "16" },
    { "American Heart", "1992", "Drama", "12" }, { "Das Schloss im Himmel", "1986", "Anime", "6" },
    { "Der Einzelgänger", "1981", "Krimi", "18" }, { "Das fliegende Auge", "1983", "Action", "12" },
    { "Christopher Columbus", "1985", "Serie", "12" }, { "Wahlverwandtschaften", "1974", "Drama", "6" }, { "Kohlpiesels Töchter", "1979", "Komödie", "16" },
    { "Zwischen zwölf und drei", "1975", "Western", "12" }, { "Die Ritter der Kokosnuss", "1975", "Abenteuer", "12" } ,{ "Moses", "1975", "Drama", "12" }, 
    { "Du liebst mich, du liebst mich nicht", "2008", "Bollywood", "6" }, { "Reise ins Ehebett", "1966", "Komödie", "0" },
    { "Der gewisse Kniff", "1965", "Komödie", "0" }, { "Superhirn in Tennisschuhen", "1969", "Komödie", "6" },
    { "Meines Vaters Pferde", "1953", "Drama", "6" }, { "Geheimnis zweier Ozeane", "1956", "Science-Fiction", "6" },
    { "Wunder der Prärie", "1955", "Dokumentation", "0" }};


 
     
    String[] columnNames =  {
      "Filmtitel", "Erscheinungsjahr", "Genre", "FSK"
    };


    JFrame f = new JFrame();
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );


    JTable table = new JTable( rowData, columnNames );
    f.add( new JScrollPane( table ) );


    f.pack();
    f.setVisible( true );
  } 
}
Das die Tabelle erstellt wird funktioniert. Aber wie kriegen wir das jetzt nach verschiedenen Kategorien gefiltert/sortiert?

Danke schonmal und liebe Grüße!
 
Also zum sortieren gibt es mehrere Möglichkeiten. Ich bin der meinung das java das zwar auch selber kann, allerdings weiß ich gerade nicht wie.
wenns um ein schulprojekt geht dann reicht aber auch ein langsamerer ansatz. guckt euch mal bubblesort an, ist imho die einfachste art etwas zu sortieren.

Ebenfalls wäre es hilfreich in dem eigentlichen tabellen Array nicht unbedingt die werte selber zu speichern, sondern DVD objekte zu speichern: und diese enthalten dann sowas wie den Titel, das Erscheinungsjahr, Genre und FSK. hat den vorteil dass sich zb. die FSK-freigaben besser vergleichen lassen und man einen filter FSK16 und darunter setzen könnte, nur als beispiel.

Das Filtern lässt sich generell so darstellen dass man ein neues Array erzeugt und dann nur die Werte überträgt die die Bedingungen erfüllen.

Das erstmal nur als ansatz. Bei fragen dazu einfach raus damit, aber versuchts erstmal selber 🙂

mfG, Chloroplast
 
Danke für eure Antworten!
Wir haben jetzt schon ewig rumprobiert, aber so wirklich funktioniert hat es noch nicht.

https://docs.oracle.com/javase/tutorial/uiswing/components/table.html
Da stehen schon Beispiele, die für die meisten Standard-Anwendungen reichen sollten.

Sortierung ist mit einer Zeile Code machbar und Filtern mit 4 Zeilen Code.
Da kommt bei uns immer schon bei set.AutoRowSorter(true) eine Fehlermeldung ("identifier expected" vor der Klammer) Was ist denn da das Problem?

Chloroplast hat gesagt.:
guckt euch mal bubblesort an, ist imho die einfachste art etwas zu sortieren.
Mit Bubblesort haben wir es auch probiert, allerdings sortiert er bei uns dann nur die Zahlen, nicht in Kombination mit den zugehörigen DVD-Namen. Ist das immer so oder kann man das noch ergänzen?

LG
 
Es heißt auch: table.setAutoCreateRowSorter( true );
Aber zum filtern braucht ihr sowieso einen eigenen RowSorter:
Java:
TableRowSorter<TableModel> tableRowSorter = new TableRowSorter<TableModel>( model );
table.setRowSorter( tableRowSorter );

Da nur Strings und Integers in der Tabelle sind kann die Tabelle damit schon automatisch richtig sortiert werden. Ihr müsst nur darauf achten, dass bei euerem TableModel die Methode getColumnClass überschrieben wird und die richtigen Werte zurück liefert. Sonst werden die Integers als Strings (also lexikographisch) sortiert.

Den tableRowSorter kann man dann auch zum Filtern verwenden. Wie das geht steht im Link den ich gepostet habe.
 

Zurück
Oben