QList die aus mehreren Klassenelementen besteht sortieren
-
Locutus
QList die aus mehreren Klassenelementen besteht sortieren
Ich arbeite in meinem Programm mit einer QList, in der ich die Daten einer Klasse reinpacke.
Diese Klasse besteht u.a. aus Dateiname und Dateigröße. Ich würde nun gerne diese QList nach der Dateigröße sortieren. Allerdings geht das scheinbar nicht und die Anleitung geht da nicht drauf ein.
Ist es trotzdem möglich?
Ich habe das Problem bei mir so gelöst, daß ich eine zweite QList benutze, wo ich die Dateigrößen reinpacke und dort sortiere. Allerdings wäre es praktisch, wenn das auch mit nur einem Container gehen würde.
Gruß,
Locutus
Diese Klasse besteht u.a. aus Dateiname und Dateigröße. Ich würde nun gerne diese QList nach der Dateigröße sortieren. Allerdings geht das scheinbar nicht und die Anleitung geht da nicht drauf ein.
Ist es trotzdem möglich?
Ich habe das Problem bei mir so gelöst, daß ich eine zweite QList benutze, wo ich die Dateigrößen reinpacke und dort sortiere. Allerdings wäre es praktisch, wenn das auch mit nur einem Container gehen würde.
Gruß,
Locutus
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
-
Locutus
Mit qSort habe ich es anfangs auch direkt versucht, aber da bekomme ich nur Compiler-Fehler.Christian81 hat geschrieben:Was ist gegen qSort() einzuwenden?
Der Aufruf sieht wie folgt aus:
Code: Alles auswählen
qSort(Alle_Dateien.begin(), Alle_Dateien.end());Code: Alles auswählen
g:\temp\qt\include\qtcore\../../src/corelib/tools/qalgorithms.h(156) : error C2678: Binärer Operator '<': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const Dateien_Container' akzeptiert (oder keine geeignete Konvertierung möglich)
g:\temp\qt\include\qtcore\../../src/corelib/tools/qchar.h(289): kann 'bool operator <(QChar,QChar)' sein
g:\temp\qt\include\qtcore\../../src/corelib/tools/qbytearray.h(445): oder "bool operator <(const QByteArray &,const QByteArray &)"
g:\temp\qt\include\qtcore\../../src/corelib/tools/qbytearray.h(447): oder "bool operator <(const QByteArray &,const char *)"
g:\temp\qt\include\qtcore\../../src/corelib/tools/qbytearray.h(449): oder "bool operator <(const char *,const QByteArray &)"
g:\temp\qt\include\qtcore\../../src/corelib/tools/qstring.h(788): oder "bool operator <(const char *,const QString &)"
bei Anpassung der Argumentliste '(const Dateien_Container, const Dateien_Container)'
g:\temp\qt\include\qtcore\../../src/corelib/tools/qalgorithms.h(155): Bei der Kompilierung der Klassen-template der bool qLess<T>::operator ()(const T &,const T &) const-Memberfunktion
with
[
T=Dateien_Container
]
g:\temp\qt\include\qtcore\../../src/corelib/tools/qalgorithms.h(401): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "qLess<T>".
with
[
T=Dateien_Container
]
g:\temp\qt\include\qtcore\../../src/corelib/tools/qalgorithms.h(175): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void QAlgorithmsPrivate::qSortHelper<RandomAccessIterator,T>(RandomAccessIterator,RandomAccessIterator,const T &)".
with
[
RandomAccessIterator=QList<Dateien_Container>::iterator,
T=Dateien_Container
]
.\algo.cpp(222): Siehe Verweis auf die Instanziierung der gerade kompilierten Funktions-template "void qSort<QList<T>::iterator>(RandomAccessIterator,RandomAccessIterator)".
with
[
T=Dateien_Container,
RandomAccessIterator=QList<Dateien_Container>::iterator
]Code: Alles auswählen
class Dateien_Container{
public:
QString Dateiname;
QString Dateiname_ohne_Pfad;
unsigned long int Dateigroesse;
};Code: Alles auswählen
QList<Dateien_Container> Alle_Dateien;Deswegen bin ich auch den Umweg über einen zweiten Container gegangen, würde aber gerne wissen ob das auch mit nur einen Container gehen würde.
Zuletzt geändert von Locutus am 6. Februar 2007 14:30, insgesamt 1-mal geändert.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
-
Locutus
RTM?Christian81 hat geschrieben:Ich würde mal sagen: RTM!
Ja genau das ist der Punkt, worüber ich bisher gestolpert bin und weswegen ich der Meinung war, es geht eventuell nicht.This function requires the item type (in the example above, int) to implement operator<().
Ich weiß nicht was ich für int einsetzen soll.
Sortieren kann man ja z.B. hiermit: qSort(Alle_Dateien.begin(), Alle_Dateien.end(), qGreater<int>()); - so mache ich es bei meinem zweiten Container.
Normalerweise müßte ich ja nur dem Compiler sagen, daß er von der Klasse "unsigned long int Dateigroesse;" benutzen soll, aber über Alle_Dateien habe ich keinen direkten Zugang darauf.
Ist vermutlich 'ne einfache Sache, habe aber in der Literatur leider keine konkrete Hilfe gefunden.
Okay danke, werde ich machen.Ach ja - die Dateigrösse würde ich dann auch gleich mit Qt-Mitteln beschreiben -> qint64
schreib dir doch eine Funktion sort( SortValue ).
SortValue ist ein enum (welchen du selber definieren musst), mit dem du wählen kannst, nach welchem Element sortiert werden soll. Als Methode deiner Klasse definiert sortiert sie direkt den als Member deklarierten QList mit deinen Dateien.
Kannst natürlich genauso vorgehen wie bei qSort mit begin() und end() + SortValue.
Grüße
Franz
SortValue ist ein enum (welchen du selber definieren musst), mit dem du wählen kannst, nach welchem Element sortiert werden soll. Als Methode deiner Klasse definiert sortiert sie direkt den als Member deklarierten QList mit deinen Dateien.
Kannst natürlich genauso vorgehen wie bei qSort mit begin() und end() + SortValue.
Grüße
Franz
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Ich würde sagen C++ in 21 Tagen, Tag 20 (jetzt hoffe ich nur dass ich die Syntax richtig hinbekommeLocutus hat geschrieben:[Ja genau das ist der Punkt, worüber ich bisher gestolpert bin und weswegen ich der Meinung war, es geht eventuell nicht.This function requires the item type (in the example above, int) to implement operator<().
Ich weiß nicht was ich für int einsetzen soll.
Code: Alles auswählen
bool operator<(const QList<Dateien_Container> &t1, const QList<Dateien_Container> &t2)
{
return (t2.Dateigroesse < t1.Dateigroesse);
}
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Oh, hab ich da was falsch verstanden? Ich dachte er hat ne Klasse (o.ä.) in der er Attribute (Name, Größe, etc) einer Datei speichert. Diese sammelt er in einer QList. Nun möchte er diese Liste sortieren nach einem bestimmten Kriterium (z.B. Größe). Eben so wie es in einem Dateimanager bei der "Detaillierte Liste" (oder so) möglich ist, wo man diese Dateien auch nach verschiedenen Kriterien sortieren kann.Christian81 hat geschrieben:Code: Alles auswählen
bool operator<(const QList<Dateien_Container> &t1, const QList<Dateien_Container> &t2) const { return (t2.Dateigroesse < t1.Dateigroesse); }
(anders könnte ich mir das auch gar nicht vorstellen...)
Grüße
Franz
// Nachtrag:
QList hat doch kein Attribut namens Dateigroesse, oder?
-
Locutus
Also dann sag ich erst einmal danke für die ganzen Antworten. Das Buch C++ in 21 Tagen habe ich nicht, werde ich mir aber besorgen, hört sich interessant an.
Vor allem wenn die Thematik darin genauer besprochen wird.
@franzf
Dein Vorschlag mit enum hört sich auch sehr gut an, werde mir das alles in Ruhe mal angucken, habe bisher mit enum noch nichts gemacht.
Ja, das gehört zu meiner Klasse, genau wie du es in deinem Post gesagt hast
Bin froh das man das Problem auch ohne zweiten Container lösen kann und werde mich die Tage dransetzen, wenn ich mehr Zeit habe.
Also nochmals besten Dank euch allen.
Vor allem wenn die Thematik darin genauer besprochen wird.
@franzf
Dein Vorschlag mit enum hört sich auch sehr gut an, werde mir das alles in Ruhe mal angucken, habe bisher mit enum noch nichts gemacht.
// Nachtrag:
QList hat doch kein Attribut namens Dateigroesse, oder?
Ja, das gehört zu meiner Klasse, genau wie du es in deinem Post gesagt hast
Bin froh das man das Problem auch ohne zweiten Container lösen kann und werde mich die Tage dransetzen, wenn ich mehr Zeit habe.
Also nochmals besten Dank euch allen.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Stop, das war ein ScherzLocutus hat geschrieben:Also dann sag ich erst einmal danke für die ganzen Antworten. Das Buch C++ in 21 Tagen habe ich nicht, werde ich mir aber besorgen, hört sich interessant an.
Vor allem wenn die Thematik darin genauer besprochen wird.
Wenn, könnte es ungefähr bei Tag 20 rum auftauchen - Templates & Operatoren.
Sorry
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Code: Alles auswählen
class Dateien_Container {
public:
QString Dateiname;
QString Dateiname_ohne_Pfad;
unsigned long int Dateigroesse;
// neuer Operator
bool operator<(const Dateien_Container& dc) {
return Dateigroesse < dc.Dateigroesse;
}
};
-
Locutus
Danke für deine Rückmeldung, stevy 
Bei mir sieht der Codeabschnitt so aus:
Sortiert kann dann ganz normal über qSort werden, für alle zur Info, die vielleicht irgendwann mal vor demselben Problem stehen.
Bei mir sieht der Codeabschnitt so aus:
Code: Alles auswählen
inline bool operator<( const Dateien_Container& lhs, const Dateien_Container& rhs){
return (lhs.Dateigroesse < rhs.Dateigroesse);
}