Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  liste sortieren

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  liste sortieren (2155 mal gelesen)
gmk
Mitglied
Dipl.-Ing.(FH) Vermessung


Sehen Sie sich das Profil von gmk an!   Senden Sie eine Private Message an gmk  Schreiben Sie einen Gästebucheintrag für gmk

Beiträge: 667
Registriert: 23.10.2002

Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM

erstellt am: 19. Sep. 2005 16:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

hallo!

vl-sort liefert mir folgendes ergebnis.

(SETQ xl  '(("B" "1") ("B" "0") ("B" "1")
            ("A" "1") ("A" "1")
            ("G" "0") ("A" "2") ("A" "1")
            ("A" "2") ("B" "1")
            ("C" "0") ("C" "3") ("C" "3"))
)
(SETQ xl (vl-sort xl (function (lambda (e1 e2) (< (car e1) (car e2))))))

;ergebnis vl-sort
 
(("A" "1") ("A" "1") ("A" "2") ("A" "1") ("A" "2")
("B" "1") ("B" "0") ("B" "1") ("B" "1")
("C" "0") ("C" "3") ("C" "3")
("G" "0"))
)

ich möchte das ergebnis jetzt weiter innerhalb der "listenabschnitte" A B C G nach dem zweiten listeneintrag sortieren. (ähnlich wie in excel).

ergebnis nach dem zweiten sortiervorgang

(("A" "1") ("A" "1") ("A" "1") ("A" "2") ("A" "2")
("B" "0") ("B" "1") ("B" "1") ("B" "1")
("C" "0") ("C" "3") ("C" "3")
("G" "0"))
)


gibt's dafür in lisp eine fertige funktion, oder muss ich die einzelnen abschnitte in einer variablen zwischenspeichern, sortieren und dann wieder zu einer liste zusammenfügen?

ciao georg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 19. Sep. 2005 16:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gmk 10 Unities + Antwort hilfreich

(SETQ xl (vl-sort
          (vl-sort xl '(lambda (e1 e2) (< (cadr e1) (cadr e2))))
          '(lambda (e1 e2) (< (car e1) (car e2)))
        )
)

------------------
- Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

WolfgangGutke
Mitglied
Konstrukteur


Sehen Sie sich das Profil von WolfgangGutke an!   Senden Sie eine Private Message an WolfgangGutke  Schreiben Sie einen Gästebucheintrag für WolfgangGutke

Beiträge: 109
Registriert: 28.09.2004

AutoCAD 2002
AutoCAD 2006
ObjectDCL 2.02

erstellt am: 19. Sep. 2005 16:18    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gmk 10 Unities + Antwort hilfreich

Versuch es mal hiermit :

(vl-sort
'(("A" "1") ("A" "1") ("A" "1") ("A" "2") ("A" "2")
("B" "0") ("B" "1") ("B" "1") ("B" "1")
("C" "0") ("C" "3") ("C" "3")
("G" "0"))
  (function (lambda (e1 e2) (< (cadr e1) (cadr e2)))))

VG
Wolfgang

------------------
LISP = Lots of Insane Stupid Parantheses

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

gmk
Mitglied
Dipl.-Ing.(FH) Vermessung


Sehen Sie sich das Profil von gmk an!   Senden Sie eine Private Message an gmk  Schreiben Sie einen Gästebucheintrag für gmk

Beiträge: 667
Registriert: 23.10.2002

Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM

erstellt am: 19. Sep. 2005 16:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

danke!

@thomas
kannst du mir erklären was deine funktion im einzelnen macht.
(debugger war nicht sehr aussagekräftig, außer dass zuerst nach dem zweiten und dann nach dem ersten kriterium sortiert wird)

ciao georg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

CADmium
Moderator
Maschinenbaukonstrukteur




Sehen Sie sich das Profil von CADmium an!   Senden Sie eine Private Message an CADmium  Schreiben Sie einen Gästebucheintrag für CADmium

Beiträge: 13508
Registriert: 30.11.2003

.

erstellt am: 19. Sep. 2005 16:31    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gmk 10 Unities + Antwort hilfreich

(SETQ xl (vl-sort
          (vl-sort xl '(lambda (e1 e2) (< (car e1) (car e2))))
          '(lambda (e1 e2) (< (cadr e1) (cadr e2)))
        )
)

das innere (vl-sort xl '(lambda (e1 e2) (< (car e1) (car e2))))
sortiert die Liste xl nach dem ersten Listenelement und liefert eine sortierte Liste zurück, welche gleich die Eingabe des "äußeren" vl-sort ist welches mittels '(lambda (e1 e2) (< (cadr e1) (cadr e2))) nach dem 2. Listenelement sortiert.

------------------
- Thomas -
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Dabrunz
Mitglied



Sehen Sie sich das Profil von Dabrunz an!   Senden Sie eine Private Message an Dabrunz  Schreiben Sie einen Gästebucheintrag für Dabrunz

Beiträge: 127
Registriert: 28.05.2003

erstellt am: 19. Sep. 2005 17:05    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gmk 10 Unities + Antwort hilfreich

Tag zusammen.

Wenn ich mich recht erinnere, dann heißt eine solche Ordnung in Anlehnung an die Sortierung in Lexika oder Wörterbüchern lexikalische Ordnung. Anhand der ersten unterschiedlichen Stelle von vorne wird festgelegt, ob die eine oder die andere Liste kleiner ist. Hierbei sollen kürzere Listen, die in allen Eintägen dem Anfang der Verleichsliste entsprechen als kleiner zu interpretieren. Eine Implementierung in VLisp kann dann so aussehen:

Code:

(defun :l-lexiOrder (x y / )
  (cond
  ((and(not x)y));**  ist die 1. Liste zuende, die 2. aber nicht --> KLEINER
  ((or(not x)(not y))nil);**  mindestens eine Liste ist zu Ende UND NOT KLEINER --> GRÖßER ODER GLEICH
  ((<(car x)(car y)));** Treffer: 1. Stellen erfüllen die kanonische Ordnung
  ((=(car x)(car y));** nächste Stelle prüfen, weil bisher GLEICH
    (:l-lexiOrder(cdr x)(cdr y))
  )
  )
)

Die Sortierung der Liste kann dann mit

Code:
(vl-sort xl':l-lexiOrder)

und das unabh. von der Länge der Listen.

Achim Dabrunz

------------------

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

mapcar
Mitglied
CADmin



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 21. Sep. 2005 20:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für gmk 10 Unities + Antwort hilfreich

Extrem schöne Funktion. Hab meine gleich im Klo runtergespült;-)

Gruß, Axel

------------------
Meine AutoLisp-Seiten Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz