IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Trier un hash par rapport a un autre


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 210
    Points : 99
    Points
    99
    Par défaut Trier un hash par rapport a un autre
    J'ai besoin de votre aide pour faire un algo efficace pour comparer deux hash et supprimé du second les informations ce trouvant déjà éventuellement dans le premier :

    j'ai essayé de résoudre le problème comme ceci mais sa ne donne rien


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #!/usr/bin/perl -w
     
    my $i = {
      maison => [1,4],
      chien => [2,7]
    };
     
     
    my $n = {
      maison => [1,6],
      chien => [2,7],
      nouveau => [1,1]
    };
     
    my $l;
     
     
    #%$l = keys %{ %$i, %$n };
     
    foreach my $key (keys %$i) {
      foreach my $k (keys %$n) {
        if ( $i->{$key} =~ /$n->{$k}/i and $i->{$key}[0] eq $n->{$k}[0] and $i->{$key}[1] eq $i->{$k}[1] ) {
            delete $n->{$k};
        }
      }
    }
     
     
    foreach my $m (keys %$n) {
     print "$m :: $n->{$m}[0] :: $n->{$m}[1]\n";
    }
    ----------------
    Voila mes hash de teste, je veut supprimer de $nouveau les informations ce trouvant déjà dans $ancien, il faut donc comparer les clés et les valeurs mais je ne sais pas comment faire tout ce que j'ai essayé ne fonctionne pas :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    my $ancien = {
      maison => [1,7],
      chien  => [15,50]
    };
     
     
    my $nouveau = {
      lunette => [4,8],
      paris   => [12,5]
      chien   => [15,50]
    };
    après le passage dans l'algo il faudrait obtenir


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $nouveau = {
      lunette => [4,8],
      paris   => [12,5]
    };

    merci!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    et si tu a "chien => [15,50]" dans ancien et "chien => [13,15, 50]" dans nouveau tu veux avoir "chien => [13]" en resultat, ou virer chien ?
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    bon, j'imagine que tu veux chien => [13] (sinon un simple grep suffirait), donc voila une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    my $ancien = {
      maison => [1,7],
      chien  => [15,50]
    };
     
     
    my $nouveau = {
      lunette => [4,8],
      paris   => [12,5],
      chien   => [13, 15,50]
    };
     
    print Dumper traitement($ancien, $nouveau);
     
    sub traitement {
    	my ($ancien, $nouveau) = @_;
    	my $result = {};
     
    	while ( my ($k, $v) = each %$nouveau ) {
    		if (my $old_v = $ancien->{$k}) {
    			# key exists, do we have new values?
    			if (my @result_v = _new_tab($old_v, $v)) {
    				# new values
    				$result->{$k} = \@result_v
    			}
    		} else {
    			# new key, keep all values
    			$result->{$k} = $v;
    		}
    	}
    	return $result;
    }
     
    sub _new_tab {
    	my ($ancien, $nouveau) = @_;
    	# [12, 15, 50], [13, 15, 50] => (13)
    	# [15, 50], [15, 50] => ()
    	my %seen = map {$_ => 1} @$ancien;
    	return grep { not $seen{$_} } @$nouveau;
    }
    et ca doit donner ce:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $VAR1 = {
              'lunette' => [
                             4,
                             8
                           ],
              'paris' => [
                           12,
                           5
                         ],
              'chien' => [
                           13
                         ]
            };
    et dans l'usage que tu semble vouloir en faire il faudra faire
    $nouveau = traitement($ancien, $nouveau);
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 210
    Points : 99
    Points
    99
    Par défaut
    et si tu a "chien => [15,50]" dans ancien et "chien => [13,15, 50]" dans nouveau tu veux avoir "chien => [13]" en resultat, ou virer chien ?
    Le nombre d'éléments des tableaux est constant pour l'exemple j'en ait mis deux mais ils y en a quatre en réalité (3 en fait les tableaux commençant a 0)

    donc si dans $ancien chien => [15,50] et dans chien => [15,50] ont supprime chien de nouveau

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    ok mais si tu a [12, 15] et [13,15] tu veux [13] non ?
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

Discussions similaires

  1. [Débutant] Trier une matrice par rapport à une autre
    Par LoVan dans le forum MATLAB
    Réponses: 7
    Dernier message: 23/07/2012, 09h10
  2. Trier un vecteur par rapport à un autre
    Par jinrs dans le forum MATLAB
    Réponses: 3
    Dernier message: 07/09/2007, 15h58
  3. Filter un hash par rapport a un autre
    Par mobscene dans le forum Langage
    Réponses: 5
    Dernier message: 14/10/2006, 20h00
  4. Trie d'un hash par rapport a un autre
    Par vodevil dans le forum Modules
    Réponses: 6
    Dernier message: 18/03/2006, 11h05
  5. Trier un tableau par rapport à un autre tableau
    Par deaven dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 02/05/2005, 09h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo