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

Sortierung: mal wieder...

Leser: 1


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
Robby
 2004-02-19 09:49
#80213 #80213
User since
2003-08-11
409 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

bei folgendem Beispiel sortiere ich alles nach der ersten Spalte.
Wahlweise kann ich natürlich auch nach der 2., . oder 4. Spalte sortieren....

Wie kann ich aber zuerst nach der ersten, dann nach der 2., dann nach der 3. bis zur n-ten Spalte sortieren???

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
use strict;

my $arrayVar;
$arrayVar->{"0,0"} = "a";
$arrayVar->{"1,0"} = "a";
$arrayVar->{"2,0"} = "a";
$arrayVar->{"3,0"} = "a";
$arrayVar->{"4,0"} = "b";

$arrayVar->{"0,1"} = "2";
$arrayVar->{"1,1"} = "2";
$arrayVar->{"2,1"} = "3";
$arrayVar->{"3,1"} = "3";
$arrayVar->{"4,1"} = "3";

$arrayVar->{"0,2"} = "aaa";
$arrayVar->{"1,2"} = "bbb";
$arrayVar->{"2,2"} = "aaa";
$arrayVar->{"3,2"} = "bbb";
$arrayVar->{"4,2"} = "bbb";

$arrayVar->{"0,3"} = "1";
$arrayVar->{"1,3"} = "2";
$arrayVar->{"2,3"} = "3";
$arrayVar->{"3,3"} = "4";
$arrayVar->{"4,3"} = "5";


my @data;

# $arrayVar umwandeln in 2-dim. Array:
for (keys %$arrayVar) {
my ($y, $x) = split /,/;
$data[$y][$x] = $arrayVar->{$_};
}

# Array sortieren nach $spalte:
my $spalte = 0; # erste Spalte
my @sorteddata = sort { $a->[$spalte] cmp $b->[$spalte] } @data;

# $arrayVar neu aufbauen mit @sorteddata:
$arrayVar = {};
for my $y (0 .. $#sorteddata) {
for my $x (0 .. $#{$sorteddata[$y]}) {
$arrayVar->{"$y,$x"} = $sorteddata[$y][$x];
}
}

# testen:
use Data::Dumper;
print Dumper \@sorteddata;
Kaum macht man es richtig - schon funktioniert es!
renee
 2004-02-19 09:57
#80214 #80214
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
zum Thema Sortierungen findest Du ausfühliche Antwort bei Strat: http://fabiani.net/perl/basics/sort.shtml
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/
Crian
 2004-02-19 11:42
#80215 #80215
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Und bei mir.

Insbesondere die Beispiele 4a-4d sollten für Dich interessant sein.\n\n

<!--EDIT|Crian|1077183806-->
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
Robby
 2004-02-19 11:50
#80216 #80216
User since
2003-08-11
409 Artikel
BenutzerIn
[default_avatar]
Wie sie alle Schleichwerbung für Perl-Seiten machen.... :D :D :D

Danke Euch beiden!
Jetzt tut es! *freu*
Kaum macht man es richtig - schon funktioniert es!
renee
 2004-02-19 12:59
#80217 #80217
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es ist ja noch nicht mal meine eigene (hab ja auch keine...) ;)
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/
Crian
 2004-02-19 13:41
#80218 #80218
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Und ich hab auf meiner frühere Erklärungen zu mir zu Sortierungsfragen im alten Forum festgehalten... da ist es dann doch passend, darauf zu verweisen. Könnte man hier noch HTML verwenden, könnte ich das auch reinkopieren, aber so http://www.adventure-treff.de/forum/images/smiles/...
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
Robby
 2004-02-23 09:29
#80219 #80219
User since
2003-08-11
409 Artikel
BenutzerIn
[default_avatar]
Jetzt hätte ich aber nochmal eine Frage bezüglich Sortierung nach dem Alphabet und nach Zahlen (cmp und <=>)....

Nach mehreren Spalten sortieren kann ich ja jetzt siehe Beispiel:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use strict;

my $arrayVar;
$arrayVar->{"0,0"} = "a";
$arrayVar->{"1,0"} = "a";
$arrayVar->{"2,0"} = "a";
$arrayVar->{"3,0"} = "a";
$arrayVar->{"4,0"} = "a";

$arrayVar->{"0,1"} = "3";
$arrayVar->{"1,1"} = "2";
$arrayVar->{"2,1"} = "2";
$arrayVar->{"3,1"} = "3";
$arrayVar->{"4,1"} = "3";

$arrayVar->{"0,2"} = "aaa";
$arrayVar->{"1,2"} = "bbb";
$arrayVar->{"2,2"} = "aaa";
$arrayVar->{"3,2"} = "bbb";
$arrayVar->{"4,2"} = "bbb";

my @data;

# $arrayVar umwandeln in 2-dim. Array:
for (keys %$arrayVar) {
   my ($y, $x) = split /,/;
   $data[$y][$x] = $arrayVar->{$_};
}

# Array sortieren nach $spalte:
my @sorteddata = sort { $a->[0] cmp $b->[0] || $a->[1] <=> $b->[1] ||$a->[2] cmp $b->[2] } @data;

# $arrayVar neu aufbauen mit @sorteddata:
$arrayVar = {};
for my $y (0 .. $#sorteddata) {
   for my $x (0 .. $#{$sorteddata[$y]}) {
       $arrayVar->{"$y,$x"} = $sorteddata[$y][$x];
   }
}

# testen:
use Data::Dumper;
print Dumper \@sorteddata;


Hier wird nach
- Spalte 1 Alphanumerisch
- Spalte 2 Numerisch
- Spalte 3 Alphanumerisch
sortiert.

Wie kann ich das dynamisch machen, sprich wenn Zahlen
in der Splate sind nach Zahlen sortieren, ansonsten alphanumerisch???

[EDIT] Natürlich sollte das ganze mit beliebig vielen Spalten funktionieren :D\n\n

<!--EDIT|Robby|1077522236-->
Kaum macht man es richtig - schon funktioniert es!
Crian
 2004-02-23 10:50
#80220 #80220
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Hmmm... wenn Du sicherstellen kannst, dass in den nicht-numerischen Spalten keine rein numerischen Werte vorkommen, könntest Du erst mit [^0-9.,_] oder so auf das Vorhandensein von nicht-Zahlenwerten testen, wenn das Erfolg hat, vergleichst Du mit cmp, sonst mit <=>.

Oder Du vergleichst mit <=> in einem Eval-Block, wenn das fehlschlägt nimmst Du cmp. (Hmmm ist das eine gute Idee??).\n\n

<!--EDIT|Crian|1077526263-->
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
Crian
 2004-02-23 10:52
#80221 #80221
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Oder Du schreibst Dir ein Programm, das ersteinmal alle Werte in allen Spalten analysiert und Dir dann eine Funktion erzeugt, die Du in sort verwenden kannst.
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
Robby
 2004-02-23 11:06
#80222 #80222
User since
2003-08-11
409 Artikel
BenutzerIn
[default_avatar]
Ich kann sicherstellen, das alle Werte numerisch sind :)
Ich hab mal folgendes gebastelt was funktioniert

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my @sorteddata = sort rulez1 @data;

...

sub rulez1
{
my $test;
if ( $a->[0] =~ /^[0-9]*$/ && $b->[0] =~ /^[0-9]*$/ )
{
$test = $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1];
}
else
{
$test = $a->[0] cmp $b->[0] || $a->[1] cmp $b->[1];
}
return $test;
}



Jetzt ist nur die Frage, wie ich $test DYNAMISCH zusammen bauen kann weil für die 2. Spalte stimmt das numerisch/alphanumerisch ja nicht mehr :(
Kaum macht man es richtig - schon funktioniert es!
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2004-02-19 09:49.