Schrift
[thread]5976[/thread]

Sortierung mehrdimensionaler Arrays

Leser: 1


<< >> 10 Einträge, 1 Seite
renee
 2003-12-18 16:25
#76548 #76548
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich habe z.B. folgendes Array:
Code: (dl )
1
2
3
4
5
my @array = ([0,5,3,8],
[2,7,4,9],
[2,6,2,19],
[1,7,3,9],
[1,4,2,6]);

Jetzt möchte ich dieses Array erst nach der 1. Spalte, danach nach der 2. Spalte sortieren. Wie geht das?

Als Ergebnis soll folgendes rauskommen:
Code: (dl )
1
2
3
4
5
0,5,3,8
1,4,2,6
1,7,3,9
2,6,2,19
2,7,4,9
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
havi
 2003-12-18 16:33
#76549 #76549
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Mit Perl muss man haeufig auch komplexere Datenstrukturen sortieren.
Man kann die Datenstrukturen entweder zerlegen und einen der oben
erklaerten Algorithmen verwenden. Perl bietet allerdings auch
maechtigere Mittel an, wie z.B. die Schwartzian Transform:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
my @list = ( [0, 3, 2, 4],
[1, 3, 1, 5],
[2, 9, 5, 2],
); # zweidimensionales Array => Sortierung nach Spalte 4

1: my $sortedList = # von unten nach oben lesen
2: map { $_->[1] } # werfe 0. Spalte weg und gebe Originalliste zurueck
3: sort { $a->[0] <=> $b->[0] } # sortiere neue Listenreferenz nach 0. Spalte
4: map { [ $_->[3], $_ } } # mache 2dim-Listenreferenz daraus: [ $_[3], [...] ]
5: @list; # nehme Liste


Beschreibung:

Zeilen 5 + 4: Mache aus der Liste eine zweidimensionale Liste,
deren erste Dimension das Feld ist, nach dem sortiert werden soll
(In unserem Fall also das Element mit dem Index 3) und die zweite
Dimension ist eine Referenz auf die Zeile (z.B. [0,3,2,4]).

Code: (dl )
1
2
3
@tempList = ( [4, [0, 3, 2, 4] ],
[5, [1, 3, 1, 5] ],
[2, [2, 9, 5, 2] ] );


Zeile 3: Sortiere diese temporaere Liste nach 0. Index

Code: (dl )
1
2
3
4
@tempList = ( [2, [2, 9, 5, 2] ],
[4, [0, 3, 2, 4] ],
[5, [1, 3, 1, 5] ]
);


Zeile 2: Gebe die Spalte mit dem Index 1 der nun sortierten Liste zurueck

Code: (dl )
1
2
3
4
@sortedList = ( [2, 9, 5, 2],
[0, 3, 2, 4],
[1, 3, 1, 5]
);


Zu finden auf Strat's Homepage

Gruss
kabel
 2003-12-18 16:36
#76550 #76550
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
@array = sort {
$a->[0] <=> $b->[0] or
$a->[1] <=> $b->[1] or
$a->[2] <=> $b->[2] or
$a->[3] <=> $b->[3]
} @array;


HTH
-- stefan
renee
 2003-12-18 16:39
#76551 #76551
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@havi: das habe ich auch gesehen, aber das sortiert ja nur einmal. Wenn man in einem 2. Durchgang nach einer anderen Spalte sortieren würde, dann wäre die Sortierung des ersten Durchgangs hinfällig...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
havi
 2003-12-18 16:41
#76552 #76552
User since
2003-08-04
2036 Artikel
BenutzerIn
[Homepage]
user image
Ich dachte das kannst du vielleicht selbst einbauen, aber
das ist jetzt ja hinfaellig.
Danke @kabel

Gruss
renee
 2003-12-18 17:19
#76553 #76553
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Genau: Danke @kabel!!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2003-12-18 17:55
#76554 #76554
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=havi,18.12.2003, 15:33]Perl bietet allerdings auch
maechtigere Mittel an, wie z.B. die Schwartzian Transform:[/quote]
welche hier allerdings überflüssig ist...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2003-12-18 18:46
#76555 #76555
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
[quote=renee,18.12.2003, 15:25]ich habe z.B. folgendes Array:
Code: (dl )
1
2
3
4
5
my @array = ([0,5,3,8],
               [2,7,4,9],
               [2,6,2,19],
               [1,7,3,9],
               [1,4,2,6]);

Jetzt möchte ich dieses Array erst nach der 1. Spalte, danach nach der 2. Spalte sortieren. Wie geht das?

Als Ergebnis soll folgendes rauskommen:
Code: (dl )
1
2
3
4
5
0,5,3,8
1,4,2,6
1,7,3,9
2,6,2,19
2,7,4,9
[/quote]
Schau Dir mal dieses Snippet auf meiner Perlseite an, das macht etwas analoges.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2003-12-18 20:03
#76556 #76556
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=havi,18.12.2003, 15:33]Mit Perl muss man haeufig auch komplexere Datenstrukturen sortieren.
Man kann die Datenstrukturen entweder zerlegen und einen der oben
erklaerten Algorithmen verwenden. Perl bietet allerdings auch
maechtigere Mittel an, wie z.B. die Schwartzian Transform:
...[/quote]
wobei man sich da die beiden maps auch sparen kann...
Code: (dl )
1
2
3
4
5
6
my @list = ( [0, 3, 2, 4],
[1, 3, 1, 5],
[2, 9, 5, 2],
); # zweidimensionales Array => Sortierung nach Spalte 4

my @sorted3 = sort { $a->[3] <=> $b->[3] } @list;
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2003-12-18 20:06
#76557 #76557
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=renee,18.12.2003, 15:25]Als Ergebnis soll folgendes rauskommen:
Code: (dl )
1
2
3
4
5
0,5,3,8
1,4,2,6
1,7,3,9
2,6,2,19
2,7,4,9
[/quote]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my @array = ([0,5,3,8],
[2,7,4,9],
[2,6,2,19],
[1,7,3,9],
[1,4,2,6]);
my @sortedArray =
sort {
$a->[0] <=> $b->[0]
or
$a->[1] <=> $b->[1]
or # ab hier ist es zwar nicht mehr gefragt, aber...
$a->[2] <=> $b->[2]
or
$a->[3] <=> $b->[3]
} @array;

<=> (oder cmp) liefert naemlich bei gleichheit 0 zurueck, und durch die kurzschlussauswertung des or's wird dann der naechste ausdruck (1) ausgewertet
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 10 Einträge, 1 Seite



View all threads created 2003-12-18 16:25.