Thread Sortierung nach Array (18 answers)
Opened by bianca at 2012-12-25 18:11

bianca
 2012-12-26 15:07
#164411 #164411
User since
2009-09-13
6970 articles
BenutzerIn

user image
Ich glaube, nun habe ich es doch geschnackelt.
Scheint soweit zu funktionieren.
Gibt es von euch Optimierungsvorschläge?
Ist das überhaupt korrekt, wie ich das gemacht habe oder fliegt das bei ein paar mehr Datensätzen durch die Luft? :)
Code (perl): (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/perl -w
use strict;
use warnings;

my %uebergabe = (
    data    => {
        1   => {
            1   => 'aaron',
            2   => 'suppe',
            3   => 10,
        },
        2   => {
            1   => 'aaron',
            2   => 'zander',
            3   => 20,
        },
        3   => {
            1   => 'hannes',
            2   => 'zander',
            3   => 20,
        },
    },
    art             => ['a','a','n'],   # Art der Spalte a=Alpha oder n=Nummer
    sortierprio     => [3,2,1],         # Nummer der Spalte in der Reihenfolge der Sortierung
    sortierricht    => [1,1,1],         # Sortierrichtung 0=abwärts/rückwärts oder 1=aufwärts/vorwärts
);
tabellenhandler(\%uebergabe);

###############################################################################

sub tabellenhandler {
    my ($input) = @_;
    foreach my $zeile (
        sort {
            my $return = 0;
            my $spalte = -1;
            while (!$return && $spalte < scalar @{$input->{sortierprio}}) {
                $spalte ++;
                my $vergleich_spalte = $input->{sortierprio}[$spalte];
                if ($input->{sortierricht}[$vergleich_spalte - 1]) {
                    if ($input->{art}[$vergleich_spalte - 1] eq 'n') {
                        $return = $input->{data}{$a}{$vergleich_spalte} <=> $input->{data}{$b}{$vergleich_spalte};
                    }
                    else {
                        $return = $input->{data}{$a}{$vergleich_spalte} cmp $input->{data}{$b}{$vergleich_spalte};
                    }
                }
                else {
                    if ($input->{art}[$vergleich_spalte - 1] eq 'n') {
                        $return = $input->{data}{$b}{$vergleich_spalte} <=> $input->{data}{$a}{$vergleich_spalte};
                    }
                    else {
                        $return = $input->{data}{$b}{$vergleich_spalte} cmp $input->{data}{$a}{$vergleich_spalte};
                    }
                }
            }
            $return;
        }
        keys %{$input->{data}}
    ) {
        print "Zeile:";
        foreach my $spalte (
            sort {$a <=> $b}
            keys %{$input->{data}{$zeile}}
        ) {
            print " - ".$input->{data}{$zeile}{$spalte};
        }
        print "\n";
    }
}
10 print "Hallo"
20 goto 10

View full thread Sortierung nach Array