tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
1884
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Cherry07 Cherry07 ist offline Mitglied Bronze
    Registriert seit
    Nov 2007
    Beiträge
    36
    Hallo,

    ich sollte eine PlayListe die von LinkedList abgeleitet ist nach 4 Kriterien sortieren und möchte euch mal fragen, ob das so stimmt wie ich es gemacht habe.
    Bei dieser Aufgabe gibt es eine Klasse Enum SortierKriterium, eine Klasse PlayListe und eine Klasse AudioFile, die noch weitere Subklassen besitzt.
    Ich beschränke mich hier nur auf die relevanten Klassen bzw. CodeAusschnitte, da das ganze Projekt viel zu umfangreich ist.

    Hier erstmal die Klasse Enum SortierKriterium:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public enum SortierKriterium
    {
            AUTOR, TITEL;     //SortierKriterien
     
            private static SortierKriterium sortKrit;
     
            SortCriterion ()
            {     
            }
            //statische Getter und Setter für das Attribut
    }

    dann die Klasse AudioFile, die das Interface Comparable implementiert und nur AudioFile-Objekte vergleichen soll:
    (in dieser Klasse wird bzgl. der Sortierung nur die Methode compareTo von Comparable implementiert...)
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    abstract class AudioFile
    implements Comparable<AudioFile> 
    //hier findet nur die Extrahierung von Autor und Titel innerhalb eines Pfadnamens ab und 
    //ein paar abstract Methoden wie play(), usw. (was im Grunde unwichtig für die Sortierung 
    //ist
     
    public int compareTo(AudioFile other)
    { 
            //AudioFile.compareTo gibt den Wert des Vergleichs des eigenen Titels mit dem des 
            //anderen AudioFiles zurück, wenn sortKrit == TITEL ist
            if (SortierKriterium.getSortKrit() == SortierKriterium.TITEL)
                return this.titel.compareTo(other.getTitle());
             
            //analog dazu dann auch mit AUTOR
            else if (SortierKriterium.getSortKrit() == SortierKriterium.AUTOR)
                return this.autor.compareTo(other.getAutor());
            
            else
                return 0;
    }

    und zu allerletzt die PlayListe, die von LinkedList abgeleitet ist:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    import java.util.LinkedList;
    import java.util.Collections;
     
    public class PlayList 
    extends LinkedList<AudioFile>
    {
        //...
        //die sort-Methode bekommt ein Sortkriterium übergeben und belegt damit sortKrit vor
        public void sort(SortierKriterium sortKrit)
        {
            SortierKriterium.setSortKrit (sortKrit);
            Collections.sort(this);
        }
        //...
        //
         public static void main (String[] args)
         {   
            PlayList pl1 = new PlayList();
            //in pl1 wird dann einpaar Pfade eingefügt, wo sich halt der Song befindet
            //dann wird mit pl1.sort aufgerufen
            pl1.sort(SortierKriterium.AUTOR);
         }
    }


    Vielen Dank erstmal und ein schönes Wochende
    cherry07
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Also mit was statischem sollte man nur sehr sparsam arbeite und das ist hier absolut nicht angebracht sondern zeigt nur mangelnde Objektorientierte Programmierung. Du könntest so ja nicht gleichzeitig nach zwei Sachen sortieren. Static ist selten angebracht, versuche das zu vermeiden (es sei denn für Konstanten static final)

    Eigentlich sollte doch dass Sortierkriterium wissen wie zu sortieren ist oder? So würde ich es von dem Objekt erwarten. Nun man kann Enums auch Methoden geben:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    import java.util.Collections;
    import java.util.Comparator;
     
    public enum SortierKriterium {
        AUTOR {
            public Comparator<AudioFile> getComparator() {
                Comparator<AudioFile> comp = new Comparator<AudioFile>() {
     
                    @Override
                    public int compare(AudioFile o1, AudioFile o2) {
                        return o1.getTitle().compareTo(o2.getTitle());
                    }
     
                };
                return comp;
            }
        }
     
        ,
        TITEL {
            public Comparator<AudioFile> getComparator() {
                Comparator<AudioFile> comp = new Comparator<AudioFile>() {
     
                    @Override
                    public int compare(AudioFile o1, AudioFile o2) {
                        return o1.getAutor().compareTo(o2.getAutor());
                    }
     
                };
                return comp;
            }
        };
     
        public abstract Comparator<AudioFile> getComparator();
     
    }

    Aufruf:
    Code java:
    1
    2
    3
    4
    
    public void sort(SortierKriterium sortKrit)
        {
            Collections.sort(this,sortKrit.getComparator());
        }

    Schicker oder?
     

  3. #3
    Cherry07 Cherry07 ist offline Mitglied Bronze
    Registriert seit
    Nov 2007
    Beiträge
    36
    Hallo,

    erstmals danke für deine Hilfe.
    Ich find auch des deine Lösung viel besser ist als meine. Aber lt. Aufgabenstellung sollte das Attribut schon static sein.
    Ja schon die eigentliche Sortierung nimmt die API vor, da hast du recht, aber lt. Aufgabenstellung sollte das Sortieren nach mehren Kriterien möglich sein.

    "SortierKriterium bekommt ein statisches Attribut sortKrit, das das momentane Sortierkriterium angibt. Dieses Attribut hat einen statischen getter und setter.
    Die sort-Methode von PlayList bekommt als Parameter ein Sortierkriterium übergeben und belegt diese vor, bevor es Collections.sort(this) aufruft.
    AudioFile und deren Subklassen bekommen eine compareTo-Methode, die in Abhängigkeit vom Attribut sortKrit einen Vergleich vornimmt."
    So war leider die Aufgabenstellung.

    Aber wenn ich es so wie du mache, dann kann ich doch nicht public static SortKriterium sortkrit; in enum SortierKriterium machen, oder.

    Schönes Wochenende
    cherry07
     

  4. #4
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Wer bitte stellt denn so eine Aufgabe? Ich würde mich weigern das so zu lösen weil das absoluter Unsinn ist.

    Dann machs halt so wie dus vorher hattest. Und schreib bei der Lösung drunter wie mans eigentlich ordentlich macht....
     

  5. #5
    Avatar von Oliver Gierke
    Oliver Gierke Oliver Gierke ist offline Mitglied Rubin
    Registriert seit
    Dec 2003
    Ort
    Mannheim
    Beiträge
    1.457
    Ich trau mich ehrlich gesagt auch nicht, danach zu fragen, wer so eine Aufgabe stellt. Das zeugt einzig und allein davon, dass jemand wenig Ahnung von OO hat. Deine Klasse wird daurch inherent threadunsafe (sorry, Zeja ). Zumal es in diesem Fall absolut keinen Grund gibt, das Ding static zu machen.

    Zejas Lösung ist zum einen eleganter und zum anderen wesentlich objektorientierter .

    Gruß
    Ollie
     
    In theory, there is no difference between theory and practice. In practice, there is!

    www.olivergierke.de

  6. #6
    mgredeck mgredeck ist offline Grünschnabel
    Registriert seit
    May 2010
    Beiträge
    2
    Hallo,

    ich hab ein ähnliches Problem wie der Threadersteller. Die Aufgabenstellung ist bei mir jedoch etwas anders.
    Ich muss für jedes der 4 Sortierkriterien eine eigene Comparatorklasse erstellen. Laut JUnit-Test funktioniert die Sortierung jedoch nicht. Was mache ich hier falsch?
    Vielen Dank im Voraus.


    Code der Sortierung:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    public class PlayList extends LinkedList<AudioFile> {
    ...
     
    public void sort (SortCriterion order){
            if (order.contains(SortCriterion.AUTHOR))
                Collections.sort(this, new AuthorComparator());
            if (order.contains(SortCriterion.TITLE)) 
                Collections.sort(this, new TitleComparator());
            if (order.contains(SortCriterion.ALBUM)) 
                Collections.sort(this, new AlbumComparator());
            if (order.contains(SortCriterion.DURATION))
                Collections.sort(this, new DurationComparator());
        }
    ...
    }

    Beispielhaft hier die Comparatorklasse für AUTHOR:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
     public class AuthorComparator implements Comparator<AudioFile> {
        
    // der Getter getAuthor() bezieht sich auf eine weitere Klasse (AudioFile) in der der Fehler allerdings nicht liegen dürfte
     
        public AuthorComparator() {
            // TODO Auto-generated constructor stub  
            }
     
        public int compare (AudioFile af1, AudioFile af2) {
            
            return (af1.getAuthor().compareTo(af2.getAuthor()));
            }



    Code :
    1
    2
    3
    4
    5
    6
    
     public enum SortCriterion {
        AUTHOR, TITLE, ALBUM, DURATION;
     
        public boolean contains(SortCriterion author2) {
            // TODO Auto-generated method stub
            return false;     }
     

  7. #7
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Hallo,

    naja, ich könnte mir vorstellen, dass deine contains-Methode im SuchKriterium der Grund ist.
    Da sie immer false zurück gibt, ist die Wahrscheinlichkeit, dass irgendeine if-Anweisung ausgeführt wird gleich null.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  8. #8
    mgredeck mgredeck ist offline Grünschnabel
    Registriert seit
    May 2010
    Beiträge
    2
    Die contains-Methode wurde ja von Eclipse so angelegt und verlangt ausdrücklich einen Rückgabewert. Was sollte ich da stattdessen zurückgeben?
     

  9. #9
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Naja, ich schätze du wolltest vergleichen, ob es sich um ein bestimmtes Kriterium handelt.
    Da weiß ich jetzt ehrlich gesagt nicht was du mit dieser Methode möchtest.

    Code :
    1
    
    order == SortCriterion.AUTHOR

    sollte schon eher passen.

    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

Ähnliche Themen

  1. Liste nach Kriterium sortieren
    Von Cromon im Forum .NET Café
    Antworten: 1
    Letzter Beitrag: 03.05.10, 18:34
  2. Excel Liste Sortieren
    Von Saban im Forum Office-Anwendungen
    Antworten: 4
    Letzter Beitrag: 19.05.08, 09:30
  3. Elemente einer Liste zufällig sortieren / shuffle
    Von Thomas Darimont im Forum .NET Café
    Antworten: 0
    Letzter Beitrag: 30.08.07, 23:12
  4. Liste einfügen und sortieren
    Von aniram im Forum .NET Archiv
    Antworten: 4
    Letzter Beitrag: 05.05.05, 18:43
  5. Einträge in Liste Sortieren
    Von TheLuCKer im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 08.09.04, 21:59