Schrift
[thread]7796[/thread]

hash sortieren (Seite 2)

Leser: 5


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
Linuxer
 2006-03-16 00:12
#63842 #63842
User since
2006-01-27
3871 Artikel
HausmeisterIn

user image
Hi,

das geht mit der Schwartzschen Transformation:

Code: (dl )
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
#!/usr/bin/perl
use strict;
use warnings;

# $arr[0][$x] = 7
# $arr[1][$x] = 6
# $arr[2][$x] = 10
my @arr = (
[ 7, 'foo' ],
[ 6, 'bar' ],
[ 10, 'foobar' ],
);

my $x = 0;
# sortierte IDs der "ersten" Array-Ebene mittels Schwartzscher Transformation
my @sortid =
map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [ $_, $arr[$_]->[$x] ] }
0 .. $#arr;

# Ausgabe der IDs
print "@sortid", $/; # prints: 1 0 2

# Neusortierung des Array
@arr = @arr[@sortid];


Doku: http://perldoc.perl.org/perlfaq....g%29%3F

EDIT:
Wobei es bei einem AoA dieser Tiefe auch einfacher geht:
Code: (dl )
1
2
3
# initialisierung wie oben
$x=0;
@arr = sort { $a->[$x] <=> $b->[$x] } @arr;
\n\n

<!--EDIT|Linuxer|1142461330-->
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
master
 2006-03-16 09:37
#63843 #63843
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Ok.... Und wie sortiere ich nun auf der 2 oder 3 Ebene?

Geht sowas auch mit nem hash?
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
renee
 2006-03-16 10:19
#63844 #63844
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nein, ein Hash ist und bleibt unsortiert (bis auf die Möglichkeit mit dem Modul was ich oben genannt habe). Du kannst es nur so machen, dass Du für die Ausgabe sortierst...

Die Schwarzsche Transformation ist bei einfachen Arrays unnötig (wie Linuxer sich selbst verbessert hat). Dem sort ist es egal wie viel "Ebenen" Dein Array hat, Du musst nur den Teil im sort-Block dementsprechend anpassen...
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/
master
 2006-03-16 11:49
#63845 #63845
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
War mir schon klar dass, das mit der ST unnötig ist..

Das Array-Sortieren habe ich nun im Griff..
Sein 2. Bespiel war der Durchbruch...

:-)

Danke euch allen...
Schade das es mit dem Hash nicht geht..
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
esskar
 2006-03-17 01:03
#63846 #63846
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=master,16.03.2006, 10:49]Danke euch allen...
Schade das es mit dem Hash nicht geht..[/quote]
das hat mit der zugrunde liegenden Datenstruktur zu tun.
sobald du die reihenfolge der schlüssel ändern würdest, wäre es nicht mehr möglich, schnell auf die Werte hinter den Schlüsseln zuzugreifen

siehe dazu: Wikipedia:Hashtabelle
[E|B]
 2006-03-17 12:04
#63847 #63847
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@master

Was hast du gegen CPAN:Tie::Hash::Sorted wie renee bereits vorgeschlagen hat?
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2006-03-15 19:02.