Avatar billede crax Nybegynder
06. oktober 2000 - 12:23 Der er 5 kommentarer og
2 løsninger

Forskel mellem to arrays

Hejsa!

Er der en funktion eller et script i perl, der uden at bruge for mange ressourcer sammenligner to arrays (fx. @liste1 og @liste2) og returnerer de elementer der ligger i det ene, men ikke i det andet?

Eksempel :

@liste1 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
@liste2 = (1, 4, 7, 10, 11, 12, 13, 15);

Funktionen skal i dette tilfælde returnere
(11, 12, 13, 15), hvis man anvender den på @liste2 i forhold til @liste1

Nogen forslag?
Avatar billede erikjacobsen Ekspert
06. oktober 2000 - 14:32 #1
Altså, hvis de ikke er sorterede, er der ikke andet at gøre end
at løbe dem igennem med 2 forløkker, f.eks. som nedenfor, omend den
kan vist laves lidt smartere ;-)

@liste1 = (1,2,3,4,5,6,7,8,9,10);
@liste2 = (1,4,7,10,11,12,13,15);

foreach $e2 (@liste2) {
  push(@res,$e2);
  foreach $e1 (@liste1) {
    if ($e1==$e2) {pop(@res);}
  }
}

print join(\" - \",@res);
Avatar billede crax Nybegynder
06. oktober 2000 - 14:45 #2
tja... den version har jeg allerede... Så det må jeg vel nøjes med.

Avatar billede erikjacobsen Ekspert
06. oktober 2000 - 14:56 #3
Og de er ikke sorterede? Er de små eller store - måske kan det betale
sig at sortere dem inden sammenligningen, hvis de er store?
Avatar billede thunderbear Nybegynder
11. oktober 2000 - 16:43 #4
Prøv med kommandoen \"perldoc -q duplicate\"

Der er flere forslag
Avatar billede erikjacobsen Ekspert
11. oktober 2000 - 22:46 #5
Det er rigtigt thunderbear. Det gode ved Perl er, at der er så mange muligheder. Jeg fik
aldrig installeret perldoc, men du prikker til min hukommelse. Hvad med at bruge et
associeret array, som med en hashteknik er ganske effektiv til at opbevare liste1. Så
løber vi bare liste2 igennem og checker om den er der:

@liste1 = (1,2,3,4,5,6,7,8,9,10);
@liste2 = (1,4,7,10,11,12,13,15);

foreach $e1 (@liste1) {
  $r1{$e1}=1;
}
foreach $e2 (@liste2) {
  if (!$r1{$e2}) {push(@res,$e2);}
}

print join(\" - \",@res);
Avatar billede thunderbear Nybegynder
12. oktober 2000 - 09:16 #6
Hvis din Perl er nyere end version 5.003 har du helt sikkert perldoc installeret på dit system.  Check med \"perl -V\" og \"perl -v\".

Til den her slags ting er \"grep\" og \"map\" særdeles effektive.
Avatar billede erikjacobsen Ekspert
27. november 2000 - 22:35 #7
Sker her noget?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester