Schrift
[thread]11173[/thread]

Sortierung eines Arrays



<< >> 6 Einträge, 1 Seite
bAbbAZwack
 2008-01-23 16:07
#105061 #105061
User since
2008-01-23
2 Artikel
BenutzerIn
[default_avatar]
Hallo Perl-Community,

zunächst möchte ich erst einmal sagen, dass ich neu in der Perl-Branche bin. Deshalb habt ein bisschen nachsicht mit mir ^^.

Ich habe folgende Datenstrucktur erstellt:

Code: (dl )
1
2
3
4
5
6
7
8
sub datei {
return({ name => $_[0],
program_id => undef,
include_ids => undef,
module_ids => undef,
subroutine_ids => undef,
function_ids => undef});
}

Nun spechere ich alle Dateinamen mit den Endungen .f90, .f, und .f90inc im Array $datei[$id]{name}:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my @datei;
my $toll;
opendir(DIR,".");
while(my $FilesInDir = readdir(DIR)) {
if ($FilesInDir =~ /.f90$/i || $FilesInDir =~ /.f$/i || $FilesInDir =~ /.f90inc$/i)
{
$toll = datei($FilesInDir);
push(@datei, $toll);
}
}
closedir(DIR);


Mein Problem ist jetzt, dass ich den ganzen Kladderadatsch Alphabetisch nach dem Dateinamen sortieren möchte. Sprich, wenn ich z.B. a.f, b.f90, asd.f, etc. in meinem Verzeichniss habe möchte ich in meinem Array unter der $id = 0 auch den Namen a.f, bei $id = 1 : asd.f usw. sortiert haben.

Vielen Dank

bAbbA
Taulmarill
 2008-01-23 16:19
#105062 #105062
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
ungetestet:
Code (perl): (dl )
my @sortiert = sort { $a->{name} cmp $b->{name} } @datei;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
styx-cc
 2008-01-23 16:24
#105063 #105063
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Holla,
Code (perl): (dl )
1
2
3
4
5
6
perl -wle'
my $x = {name => "abc", id => 1};
my $y = {name => "bcd", id => 2};
push(my @files, $y, $x); 
@files = sort {$a->{'name'} cmp $b->{'name'}} @files;
print map {$_->{'name'}} @files;'
Pörl.
bAbbAZwack
 2008-01-23 16:27
#105065 #105065
User since
2008-01-23
2 Artikel
BenutzerIn
[default_avatar]
Ich habs direkt mal getestet. An sich funktioniert's! :-D. Habs noch auf meine Bedürfnisse umgeändert. Jetzt gibt's keine unterscheidung von Groß- und Kleinschreibung mehr:
Code (perl): (dl )
@datei = sort { uc($a->{name}) cmp uc($b->{name}) } @datei;


Und den Perl-Button hab ich auch noch gefunden ^^
Strat
 2008-01-25 12:17
#105146 #105146
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn du sehr viele Elemente hast, koennte es vielleicht schneller sein, das ueber eine Schwartzian Transform zu loesen... siehe meine HP unter Perl -> Sortierungen.

Code (perl): (dl )
1
2
3
4
5
my @sorted =
  map { $_->[1] }
  sort { $a->[0] cmp $b->[0] }
  map { [ lc($_->{name} ), $_ ] }
@unsorted;

von unten nach oben lesen:

map: Aus @unsorted wird ein zweidimensionales array gemacht:
element1 ist das Sortierkriterium, element2 ist der originalwert

sort: vergleiche die ersten Elemente des Arrays. da hier nichts mehr umgewandelt werden muss (z.B. lc), geht der Vergleich der jeweiligen vergleichskriterien schneller

map: der Originalstring wird zurueckgegeben.

Das kann - oder auch nicht - schneller sein.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
murphy
 2008-01-25 14:51
#105160 #105160
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Strat+2008-01-25 11:17:26--
wenn du sehr viele Elemente hast, koennte es vielleicht schneller sein, das ueber eine Schwartzian Transform zu loesen [...]


Das kann in der Tat schneller sein, braucht aber auf jeden Fall mehr Speicher -- es gibt halt nix umsonst ;-)
When C++ is your hammer, every problem looks like your thumb.
<< >> 6 Einträge, 1 Seite



View all threads created 2008-01-23 16:07.