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

Sortieralgorithmus: (war: Sortieralgorythmus)



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Jamthelaw
 2005-10-20 19:59
#59068 #59068
User since
2005-08-16
9 Artikel
BenutzerIn
[default_avatar]
Hallo,

Ich stehe vor folgendem Problem:

Ich habe eine Liste die ungefähr so aussieht:

Gruppe1:
PC1
PC2
PC3

Gruppe2:
PC2
PC4
PC5

Gruppe3:
PC1
PC6


Ich möchte diese Liste jetzt sortieren, dass ich einen Output bekomme, der mir die PCs und deren Gruppenzugehörigkeit anzeigt. Ungefähr so:

PC1,Gruppe1,Gruppe3
PC2,Gruppe1, Gruppe2
PC3,Gruppe1
usw.


Ich habe mir überlegt die Liste einzulesen und die Computer und die Gruppen in einen Hash zu schreiben.
Was oder wie mache ich es wenn ein PC ein 2. mal in einer anderen Gruppe auftaucht?

Greetz
Jamthelaw

edit pq: überschrift korrigiert\n\n

<!--EDIT|pq|1130197051-->
format_c
 2005-10-20 22:47
#59069 #59069
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
in welcher form liegen denn die Daten vor und in welcher form willst du die Daten sortiert haben?? Textfile Quelle textfile Ziel ???
gruss Alex
betterworld
 2005-10-20 23:36
#59070 #59070
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Ich wuerde das mit einem Hash of Arrays machen. Am Anfang liegen die Daten so vor:
Code: (dl )
my %data = ('gruppe1' => [qw/pc1 pc2 pc3/], 'gruppe2' => [qw/pc2 pc4 pc5/], 'gruppe3' => [qw/pc1 pc6/]);

Dann ordnet man das einfach mal um:
Code: (dl )
1
2
3
4
my %data2;
while (my ($gruppe, $pcs) = each %data) {
push @{$data2{$_}}, $gruppe for @$pcs;
}

und dann hat man es ja eigentlich schon:
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
use Data::Dumper;
print Dumper \%data2;

# Ausgabe:
$VAR1 = {
'pc3' => [
'gruppe1'
],
'pc5' => [
'gruppe2'
],
'pc4' => [
'gruppe2'
],
'pc6' => [
'gruppe3'
],
'pc1' => [
'gruppe3',
'gruppe1'
],
'pc2' => [
'gruppe1',
'gruppe2'
]
};
Jamthelaw
 2005-10-25 02:14
#59071 #59071
User since
2005-08-16
9 Artikel
BenutzerIn
[default_avatar]
Vielen Dank @ betterworld, genau danach habe ich gesucht, so funktioniert es :-)

Greetz,
Jamthelaw
Jamthelaw
 2005-10-25 02:54
#59072 #59072
User since
2005-08-16
9 Artikel
BenutzerIn
[default_avatar]
Noch eine Frage, könntest du noch kurz erklären was genau der Stück Code macht?

Code: (dl )
1
2
3
4
my %data2;
while (my ($gruppe, $pcs) = each %data) {
push @{$data2{$_}}, $gruppe for @$pcs;
}


Danke,

Grüsse,
Jamthelaw
Jamthelaw
 2005-10-25 04:03
#59073 #59073
User since
2005-08-16
9 Artikel
BenutzerIn
[default_avatar]
Jetzt bin ich auf das nächste Problem gestossen...

Wenn ich dem Hash %daten den Inhalt "manuell" zuweise funktioniert das ganze.

Wenn ich jedoch die Daten aus einer Datei auslese funktioniert es nicht...

Die Datei sieht so aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
Gruppe1
PC1
PC2
PC3

Gruppe2
PC2
PC4
PC5

Gruppe3
PC1
PC6


Der Code um die Datei auszulesen und die Daten in den Hash zu schreiben:

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
use Data::Dumper;
use strict;

my @computer = "";
my $gruppen;
my %daten;
my $key;
my $i = 0;

open (INFILE, 'list.txt') or die "Could not open infile !!!";

while(<INFILE>){
chomp $_;
if($_ =~ /Gruppe/){
if($i == 0){
$gruppen = $_;
}
else{
$daten{$gruppen} = [@computer];
@computer = "";
$gruppen = $_;
}
}
else{
push @computer, $_;
}
$i++;
}
$daten{$gruppen} = [@computer];


...und wenn ich hiermit die Daten umordne...

Code: (dl )
1
2
3
4
5
6
my %data2;
while (my ($gruppe, $pcs) = each %daten) {
push @{$data2{$_}}, $gruppe for @$pcs;
}

print Dumper \%data2;


erhalte ich diese Ausgabe:

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
$VAR1 = {
'PC1' => [
'Gruppe3',
'Gruppe1'
],
'' => [
'Gruppe3',
'Gruppe1',
'Gruppe1',
'Gruppe2',
'Gruppe2'
],
'PC3' => [
'Gruppe1'
],
'PC4' => [
'Gruppe2'
],
'PC2' => [
'Gruppe1',
'Gruppe2'
],
'PC6' => [
'Gruppe3'
],
'PC5' => [
'Gruppe2'
]
};


Es scheint ein kleiner Fehler beim Auslesen zu passieren, da ich einen Array zuviel habe, aber ich finde den Fehler nicht....

Thx schonmal für eure Hilfe

Grüsse,
Jamthelaw\n\n

<!--EDIT|Jamthelaw|1130199764-->
Taulmarill
 2005-10-25 12:29
#59074 #59074
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
du hast leerzeilen in deiner datei die du im moment nicht überspringst. das könntest du z.b. mit next unless $_ =~ /\w/; machen
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Ronnie
 2005-10-25 12:45
#59075 #59075
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
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
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my %lut;
my $cur;
my %rev_lut;

while(<DATA>) {
chomp;
$cur = $1 if /(Gruppe\d+)/;
push @{$lut{$cur}}, $_ unless (/Gruppe/ or /^\s*$/);
}

print Dumper \%lut;

while (my ($k, $v) = each %lut) {
push @{$rev_lut{$_}}, $k for @$v;
}

print Dumper \%rev_lut;

_ _DATA_ _
Gruppe1
PC1
PC2
PC3

Gruppe2
PC2
PC4
PC5

Gruppe3
PC1
PC6

die Antwort von Taulmarill war schon die hundert Punkte Antwort :)

EDIT: _ _ DATA _ _ Bug *grmpf*\n\n

<!--EDIT|Ronnie|1130230150-->
Taulmarill
 2005-10-25 13:17
#59076 #59076
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
könnte man sich das umsortieren des hashes nicht sparen, wenn man gleich push @{$lut{$_}}, $cur machen würde?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Ronnie
 2005-10-25 13:37
#59077 #59077
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=Taulmarill,25.10.2005, 11:17]könnte man sich das umsortieren des hashes nicht sparen, wenn man gleich push @{$lut{$_}}, $cur machen würde?[/quote]
na klar!
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2005-10-20 19:59.