Schrift
[thread]6648[/thread]

Liste von Objekten sortieren: nach der Eigenschaft Datum



<< |< 1 2 >| >> 18 Einträge, 2 Seiten
mordur
 2005-01-21 12:26
#51131 #51131
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
moins,

ich habe eine Liste :
Code: (dl )
@liste=($eins,$zwei,$drei);

Jedes Element dieser Liste ist ein Objekt(?) welches bestimmte Eigenschaften enthält. Z.B. auch ein Datum.
Code: (dl )
1
2
3
$eins->{DATE}="2005-01-01";
$zwei->{DATE}="2004-12-20";
$drei->{DATE}="2005-01-02";

Ich möchte diese Objekte nun in eine neue Liste aufnehmen und zwar nach Datum sortiert aufsteigend ( oder absteigend), so das dies entsteht:
Code: (dl )
 @sortListe=($zwei,$eins,$drei);


idee?
format_c
 2005-01-21 12:45
#51132 #51132
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
So zum 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
use strict;
sub create_obj {
my $self = {};
bless $self;
return $self;
}

my $obj1 = create_obj();
my $obj2 = create_obj();
my $obj3 = create_obj();

$obj1->{DATE}="2005-01-01";
$obj2->{DATE}="2004-12-20";
$obj3->{DATE}="2005-01-02";

sub sort_rule {
my ($year1,$month1,$day1) = split /-/,$a->{DATE};
my ($year2,$month2,$day2) = split /-/,$b->{DATE};
return $year1 <=> $year2 or
$month1 <=> $month2 or
$day1 <=> $day2
;
}

my @list = ($obj1,$obj2,$obj3);

print $_->{DATE},"\n" for sort sort_rule @list;


Gruß Alex
Relais
 2005-01-21 13:06
#51133 #51133
User since
2003-08-06
2254 Artikel
ModeratorIn
[Homepage] [default_avatar]
my @sort_liste = sort { $a->{DATE} <=> $b->{DATE} } @liste;

Oder mit Accessor date() - falls vorhanden:

my @sort_liste = sort { $a->date <=> $b->date } @liste;

Test: for ( @sort_liste ) { print $_->{DATE}, "\n" }

Das Datum ist ja bereits im schönen Iso-Format und muß nicht transformiert werden.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop 12. bis 14. Mai 2025 in München.

Winter is Coming
format_c
 2005-01-21 13:21
#51134 #51134
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Problem ist, dass du einen String mit nem numerischen Operator vergleichen willst:
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
use strict;
package Test;

sub new {
 my $self = {};
 bless $self;
 return $self;
}

package main;

my $obj1 = Test->new();
my $obj2 = Test->new();
my $obj3 = Test->new();

$obj1->{DATE}="2005-01-01";
$obj2->{DATE}="2004-12-20";
$obj3->{DATE}="2005-01-02";


my @list = ($obj1,$obj2,$obj3);

print $_->{DATE},"\n" for sort {$a->{DATE} <=> $a->{DATE}} @list;
_ _ END _ _
2005-01-01
2004-12-20
2005-01-02

Edit:Selbst mit cmp gehts nicht.
Gruß Alex\n\n

<!--EDIT|format_c|1106306564-->
mordur
 2005-01-21 13:32
#51135 #51135
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
Dieser Ansatz funktioniert doch aber sehr gut:
Code: (dl )
my @sort_liste = sort { $a->{DATE} <=> $b->{DATE} } @liste;
ptk
 2005-01-21 13:36
#51136 #51136
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Klar geht's nicht, wenn man $a mit $a vergleicht :-)
Code: (dl )
$a->{DATE} <=> $a->{DATE}
Relais
 2005-01-21 14:18
#51137 #51137
User since
2003-08-06
2254 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=format_c,21.01.2005, 12:21]Problem ist, dass du einen String mit nem numerischen Operator vergleichen willst[/quote]
Nee, das ist für Perl kein Problem an dieser Stelle, das ist da ganz tolerant.
Dein Problem war wirklich nur der kleine a/b-Tippfehler.

(ehrgeizig, wie ich bin, ist mein Code oft bis fast immer getestet,
wenn ich nicht gerade das Gegenteil behaupte.)
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop 12. bis 14. Mai 2025 in München.

Winter is Coming
format_c
 2005-01-21 14:46
#51138 #51138
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=ptk,21.01.2005, 12:36]Klar geht's nicht, wenn man $a mit $a vergleicht :-)
Code: (dl )
$a->{DATE} <=> $a->{DATE}
[/quote]
Verdammte Hacke. Sorry nehm alles zurück,

Gruß Alex
mordur
 2005-01-21 15:20
#51139 #51139
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
hm....
aber man muss "cmp" statt "<=>" nehmen, sonst gibt es falsche Ergebnisse!
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
$eins->{DATE}="2005-01-01";
$zwei->{DATE}="2005-01-02";
$drei->{DATE}="2004-12-20";
$eins->{ID}=1;
$zwei->{ID}=2;
$drei->{ID}=5;
@liste=($eins,$zwei,$drei);
my @sort_liste = sort { $b->{DATE} <=> $a->{DATE} } @liste;
for ( @sort_liste ) { print "datum: ",$_->{DATE}, "\n";
print " id: ",$_->{DATE},"\n";}

datum: 2005-01-01
id: 1
datum: 2005-01-02
id: 2
datum: 2004-12-20
id: 5



das gleiche aber mit "cmp" ergibt


datum: 2005-01-02
id: 2
datum: 2005-01-01
id: 1
datum: 2004-12-20
id: 5

Beim zweiten mal ist also richtig absteigend sortiert nach Datum. But why?
format_c
 2005-01-21 16:01
#51140 #51140
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hier ein Auszug aus perldoc perlop
Code: (dl )
1
2
3
4
5
6
7
8
9
10
Binary "<=>" returns -1, 0, or 1 depending on whether the left argument
is numerically less than, equal to, or greater than the right argument.
If your platform supports NaNs (not-a-numbers) as numeric values, using
them with "<=>" returns undef. NaN is not "<", "==", ">", "<=" or ">="
anything (even NaN), so those 5 return false. NaN != NaN returns true,
as does NaN != anything else. If your platform doesn't support NaNs then
NaN is just a string with numeric value 0.

perl -le '$a = NaN; print "No NaN support here" if $a == $a'
perl -le '$a = NaN; print "NaN support here" if $a != $a'


Gruß Alex
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2005-01-21 12:26.