Hallo liebe Community!
ich habe ein kleines problem mit der sortier-fkt mittels compareTo.
1.
Ich möchte gerne zu meinem Audioplayer weitere Klassen hinzufügen, die meine Playlist nach Author, title, album und duration sortieren.
Also 4 weitere Klassen.
Ich möchte also die vom comparator vorgeschriebene Methode "public int compare (audiofile af1, audiofile af2)" so ersetzen, dass der rückgabewert dem ergebnis des Vergleiches der attribute author der beiden übergebenen audiofiles mittels der compareTo-Methode entspricht.
Das selbe wäre ja dann auch bei title analog dazu zu machen...
habe mir einen solchen ansatz mal überlegt:
Allerdings meckert meine IDE beim letzten "author". Was stimmt da nicht?
2.
Beim Sortieren nach Album und Duration wird das ganze etwas komplizierter...
die für den Vergleich benötigten Attribute sind nicht in der (abstrakten Eltern-)Klasse AudioFile definiert.
Daher kann nicht für alle zu vergleichenden Elemente auf die benötigten Attribut zugegriffen werden.
Genauer ist das Attribut duration in meiner vorher angelegten Klasse SampledFile, und das Attribut album in der Klasse TaggedFile festgelegt.
Aus diesem Grund ist vor dem eigentlichen Vergleich eine Überprüfung nötig, ob es sich bei den beiden zu vergleichenden Objekten um Objekte der jeweils benötigten (Kind-)Klasse handelt.
Sollte das erste übergebene (oder beide) Objekt nicht vom benötigten Typ sein, würde ich gerne -1 "returnen"
Sollte das zweite Objekt nicht vom benötigten Typ seim -> return 1.
Sind beide Objekte vom benötigten Typ, gibt es wieder den Vergleich...
Da in der Elternklasse das benötigte Attribut jedoch nicht bekannt ist, ist ein Cast, also ein
explizites Umwandeln in den entsprechenden Typ nötig. So dachte ich mir, dass ich etwa mit "((TaggedFile)af1).album" ein AudioFileObjekt af1 als TaggedFile anspreche und auf das Attribut album zugreife.
Jetz würde ich gern die Klasse AlbumComparator für die Attribute album analog zu
den bereits implementierten Comparator-Klassen implementieren. Wie mache ich zusätzlich da noch die überprunf via instanceof rein??
Bei der Klasse "DurationComparator" handelt es sich ja nicht um String-Attribute; wie kann ich hier die Differenz af1.duration–af2.duration zurückgeben?
Ich schätze mal dass ich dabei wieder den Cast des Ergebnisses nach int machen muss.
Kann mir da vielleicht jemand weiterhelfen?
Habe vorallem beim zweiten Teil eher nur eine vage Vermutung, wie ich da hinkriege...
Vielen Dank,
Schönen Abend.
ich habe ein kleines problem mit der sortier-fkt mittels compareTo.
1.
Ich möchte gerne zu meinem Audioplayer weitere Klassen hinzufügen, die meine Playlist nach Author, title, album und duration sortieren.
Also 4 weitere Klassen.
Ich möchte also die vom comparator vorgeschriebene Methode "public int compare (audiofile af1, audiofile af2)" so ersetzen, dass der rückgabewert dem ergebnis des Vergleiches der attribute author der beiden übergebenen audiofiles mittels der compareTo-Methode entspricht.
Das selbe wäre ja dann auch bei title analog dazu zu machen...
habe mir einen solchen ansatz mal überlegt:
Java:
import java.util.Comparator;
public abstract class AuthorComparator implements Comparable<AuthorComparator>{
public int compareTo(AudioFile af1)
{
return af1.getAuthor().compareTo(author);
}
}
Allerdings meckert meine IDE beim letzten "author". Was stimmt da nicht?
2.
Beim Sortieren nach Album und Duration wird das ganze etwas komplizierter...
die für den Vergleich benötigten Attribute sind nicht in der (abstrakten Eltern-)Klasse AudioFile definiert.
Daher kann nicht für alle zu vergleichenden Elemente auf die benötigten Attribut zugegriffen werden.
Genauer ist das Attribut duration in meiner vorher angelegten Klasse SampledFile, und das Attribut album in der Klasse TaggedFile festgelegt.
Aus diesem Grund ist vor dem eigentlichen Vergleich eine Überprüfung nötig, ob es sich bei den beiden zu vergleichenden Objekten um Objekte der jeweils benötigten (Kind-)Klasse handelt.
Sollte das erste übergebene (oder beide) Objekt nicht vom benötigten Typ sein, würde ich gerne -1 "returnen"
Sollte das zweite Objekt nicht vom benötigten Typ seim -> return 1.
Sind beide Objekte vom benötigten Typ, gibt es wieder den Vergleich...
Da in der Elternklasse das benötigte Attribut jedoch nicht bekannt ist, ist ein Cast, also ein
explizites Umwandeln in den entsprechenden Typ nötig. So dachte ich mir, dass ich etwa mit "((TaggedFile)af1).album" ein AudioFileObjekt af1 als TaggedFile anspreche und auf das Attribut album zugreife.
Jetz würde ich gern die Klasse AlbumComparator für die Attribute album analog zu
den bereits implementierten Comparator-Klassen implementieren. Wie mache ich zusätzlich da noch die überprunf via instanceof rein??
Bei der Klasse "DurationComparator" handelt es sich ja nicht um String-Attribute; wie kann ich hier die Differenz af1.duration–af2.duration zurückgeben?
Ich schätze mal dass ich dabei wieder den Cast des Ergebnisses nach int machen muss.
Kann mir da vielleicht jemand weiterhelfen?
Habe vorallem beim zweiten Teil eher nur eine vage Vermutung, wie ich da hinkriege...
Vielen Dank,
Schönen Abend.