Font
[thread]5628[/thread]

Top der der Länder der User

Readers: 2


<< |< 1 2 >| >> 15 entries, 2 pages
stb2050
 2003-08-17 19:37
#59570 #59570
User since
2003-08-14
87 articles
BenutzerIn
[default_avatar]
Hi Ihr,

habe mir wieder etwas kniffliges ausgedacht, wo ich nicht ganz hinterkomme ...

Ich habe eine Reihe von Länder (ca. 100 Stück), und jeder User hat eines ausgewählt. Nun möchte ich berechnen, wie viel mal jedes Land ausgewählt wurde und eine Top 10 daraus erstellen.

Die Top 10 der Länder soll nachher in @laender ("$landname|||$anzahl") stehen, damit ich anschließend mit "foreach ..." die 10 Top-Länder printen kann.

Die Userdaten von denen ausgegangen wird, stehen in @userdaten ...  ($ort, $land) = split(/\|\|\|/, $userdaten[$_]);.

Ich zerbreche mir den Kopf wie ich das jetzt hinbekomme, aber komme leider auf keine Lösung. Kann mir jemand von Euch weiterhelfen?

Sollte ich erst einmal alle Länder mit Anzahl in einem Array zusammenzahlen (wie gesagt ca. 100 Länder) und danach die 10 höchsten aussortieren in einem neuen Array? Oder das Ganze direkt in einem Array machen?

Viele Grüße
Steffen\n\n

<!--EDIT|stb2050|1061134822-->
jan
 2003-08-17 19:44
#59571 #59571
User since
2003-08-04
2533 articles
ModeratorIn
[Homepage] [default_avatar]
pack sie dir in einen hash (%laender, key = land, value = anzahl) und dann lass dir den sortieren
foreach my $land (sort {$laender{$a} <=> $laender{$b}} keys %laender)
{
print $laender{$land}"\n"; # sortiert nach anahl
}
[E|B]
 2003-08-17 19:58
#59572 #59572
User since
2003-08-08
2561 articles
HausmeisterIn
[Homepage] [default_avatar]
Hi!

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my %hash = ();
foreach my $i (@userdaten){
my ($ort, $land) = split(/\|\|\|/, $i);
$hash{$land}++;
}

my $x = 0;

foreach $i (sort{$a <=> $b} values %hash){
if($x < 10){
print;
$x++;
}
}


HTH
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]
Dubu
 2003-08-17 20:23
#59573 #59573
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
@[E|B]: Bei deiner Ausgabe fehlen die Laender. ;-)
SirLant
 2003-08-17 20:30
#59574 #59574
User since
2003-08-04
516 articles
BenutzerIn
[default_avatar]
Wo du gerade dieses Beispiel hast, wie kann man in EBs Beispiel, die Keys bekommen?
Ich benutze deshalb immer keys %hash\n\n

<!--EDIT|SirLant|1061137813-->
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Shagreen
 2003-08-17 20:49
#59575 #59575
User since
2003-08-14
88 articles
BenutzerIn
[Homepage] [default_avatar]
[quote=SirLant,17.08.2003, 18:30]Wo du gerade dieses Beispiel hast, wie kann man in EBs Beispiel, die Keys bekommen?
Ich benutze deshalb immer keys %hash[/quote]
Überhaupt nicht, Du mußt schon über keys %hash gehen (siehe Jan's Ansatz).
Ein Wert kann ja mehreren Schlüsseln zugeordnet sein, einem Schlüssel ist genau ein Wert zugeordnet.\n\n

<!--EDIT|Shagreen|1061139794-->
stb2050
 2003-08-18 01:58
#59576 #59576
User since
2003-08-14
87 articles
BenutzerIn
[default_avatar]
Hi Ihr,

also mit dem ersten Teil von EB habe ich die Sachen ja schon sortiert.

Code: (dl )
1
2
3
4
5
my %hash = ();
foreach my $i (@userdaten){
my ($ort, $land) = split(/\|\|\|/, $i);
$hash{$land}++;
}


Mit dem zweiten Teil komme ich aber noch nicht so zurecht. Was macht dieser genau? Ich bekomme dort keine Ausgabe bzw. weiß nicht genau, wo die Länder mit Zahlen hinein sortiert werden.

Code: (dl )
1
2
3
4
5
6
7
8
my $x = 0;

foreach $i (sort{$a <=> $b} values %hash){
if($x < 10){
print;
$x++;
}
}


Wie gesagt möchte ich jetzt den Inhalt des Hash sortiert nach den Anzahlen, also dem Wert des Schlüssels. Maximal aber 10.

Wie kann ich im Beispiel von EB denn die 10 mit den höchsten Anzahlen ausgeben?

Viele Grüße
Steffen
SirLant
 2003-08-18 03:05
#59577 #59577
User since
2003-08-04
516 articles
BenutzerIn
[default_avatar]
EBs Variante tut das doch bereits, nur gibt es die Länder nicht mit aus.
Hatte vor einiger Zeit schonmal das problem irgendwo gesehen, aber weiß nicht mehr wie ich das hinbekommen habe, habe wohl vergessen es zu speichern.Und habe es eben beim probieren auch nicht mehr hinbekommen(bin wohl zu müde).
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
stb2050
 2003-08-18 03:19
#59578 #59578
User since
2003-08-14
87 articles
BenutzerIn
[default_avatar]
Hi,

habe es jetzt hinbekommen so wie ich wollte:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
my %hash = ();

foreach my $i (@userdaten)
{
my ($ort, $land) = split(/\|\|\|/, $i);
$hash{$land}++;
}

@sortiert = sort { $hash{$b} <=> $hash{$a} } keys %hash;

foreach(@sortiert)
{
$zahl = $hash{$_};

push(@laender, "$_|||$zahl\n");
}

for(0..9)
{
$hier = $laender[$_];
print "$hier<br>\n";
}


Danke und gute Nacht.

Viele Grüße
Steffen
Dubu
 2003-08-18 03:26
#59579 #59579
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
Code (perl): (dl )
1
2
3
4
for ( (sort {&#36hash{&#36b} <=> &#36hash{&#36a}} keys %hash)[0..9] ) {
    last unless defined;
    print "&#36_ => &#36hash{&#36_}\n";
}

ungetestet.
<< |< 1 2 >| >> 15 entries, 2 pages



View all threads created 2003-08-17 19:37.