Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6092[/thread]

Suchalgorithmus



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
[E|B]
 2004-02-23 19:08
#80294 #80294
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
HiHo!
Ich habe ein Array, das so aufgebaut ist:

Code: (dl )
1
2
3
5736385736|name|name|name|name
58476374|name|name|name|name
48695475767|name|name|name|name


Jede Zeile entspricht dabei einem Arrayelement.
Ich muss nun dieses Array sortieren. Und zwar stellen die Zahlen am Anfang einen Usernamen in Hexadezimalform dar. Der Algorithmus soll nun den richtigen Namen (also vom Hexadezimalsystem wieder umgewandelt in Buchstaben) nach dem Alphabet sortieren, wobei das gesamte Array Element im neuen sortierten Array natürlich erhalten bleiben soll.
Beispiel:

(1) Umwandlung von Hex

Code: (dl )
1
2
3
Stefan|name|name|name|name
Erik|name|name|name|name
Mark|name|name|name|name


(2) Sortierung nach Namen:

Code: (dl )
1
2
3
Erik|name|name|name|name
Mark|name|name|name|name
Stefan|name|name|name|name


Der Name muss dann natürlich nochmal in seine Hex-Darstellung umgewandelt werden.
Letztendlich sollte also das Array sortiert sein.
Wie kann ich das möglichst mit nur einem einzigen Suchalgorithmus erledigen?
Von Hex nach Buchstaben und zurück verwandele ich immer so:

Code: (dl )
1
2
3
$hex = "Erik";
$hex = unpack("H*", $hex);   # = Hexadezimal
$hex =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg; # ... und wieder zurück


Wer weiß was? ;)\n\n

<!--EDIT|[E|B]|1077556118-->
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]
Gast Gast
 2004-02-23 19:34
#80295 #80295
Code: (dl )
1
2
3
4
5
6
7
8
@x = map { $_->[0] }
sort {
$a->[1] =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg;
$b->[1]=~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg;

$a->[1] cmp $b->[1];
}
map {[$_, split /\|/]} @array;


ich würds im Grunde so machen, nur leider klappt da mit der Umwandlung was bei mir nicht und ich hab keine Zeit zum Testen.

Steve
esskar
 2004-02-23 19:56
#80296 #80296
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
sub hex2str
{
shift =~ s/([a-fA-F0-9]{2})/pack("C", hex($1))/eg;
}

@x = sort
{
my $thea = hex2str($a->[0]);
my $theb = hex2str($b->[0]);
$thea cmp $theb;
} @array;
[E|B]
 2004-02-23 21:01
#80297 #80297
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Werds probieren. Danke euch beiden!
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]
Gast Gast
 2004-02-23 21:57
#80298 #80298
jo bitte.

Kann mir vielleicht jemand erklären warum unpack bei mir zu einem anderen Ergebnis führt?


Steve
[E|B]
 2004-02-23 22:12
#80299 #80299
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wieso anderes Ergebnis? Zeig mal deinen Code.
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]
Gast Gast
 2004-02-23 22:33
#80300 #80300
Code: (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl -w

use strict;


my $hex = "Erik";
$hex = unpack("H*", $hex);

print "$hex\n";


gibt aus:

Code: (dl )
4572696b


Perl-Version v5.8.2

Steve -- danke
[E|B]
 2004-02-23 22:44
#80301 #80301
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Stimmt doch auch! Wo ist das Problem?
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]
Gast Gast
 2004-02-24 10:48
#80302 #80302
das Problem ist, dass bei mir irgendwie nicht das gleiche steht, denn wenn ich deine "hexes" umwandel bkomm ich da keine Namen raus, oder kommen da auch keine Namen raus.

danke -- Steve
[E|B]
 2004-02-24 12:23
#80303 #80303
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Da kommen auch keine Namen raus, weil es nur Beispiele von mir waren! :D
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 2004-02-23 19:08.