[Perl] Trouver la plus grande et la plus petite valeur

Trouver la plus grande et la plus petite valeur [Perl] - Perl - Programmation

Marsh Posté le 03-05-2004 à 17:22:30    

J'ai le code immonde (selon moi) qui me permet de trouver la plus petite et la plus grande valeur de mon objet
 

Code :
  1. foreach (@_) {
  2.     if ($_->total > $yAxisEnd) {
  3.       $yAxisEnd = $_->total;
  4.     }
  5.     if ($_->allowed > $yAxisEnd) {
  6.       $yAxisEnd = $_->allowed;
  7.     }
  8.     if ($_->used > $yAxisEnd) {
  9.       $yAxisEnd = $_->used;
  10.     }
  11.     if ($_->target_used > $yAxisEnd) {
  12.       $yAxisEnd = $_->target_used;
  13.     }
  14.     if ($_->limit > $yAxisEnd) {
  15.       $yAxisEnd = $_->limit;
  16.     }
  17.     if ($parameter{"projection"} && $_->projection_used > $yAxisEnd) {
  18.       $yAxisEnd = $_->projection_used;
  19.     }
  20.     if ($_->total && $_->total < $yAxisStart) {
  21.       $yAxisStart = $_->total;
  22.     }
  23.     if ($_->allowed && $_->allowed < $yAxisStart) {
  24.       $yAxisEnd = $_->allowed;
  25.     }
  26.     if ($_->used && $_->used < $yAxisStart) {
  27.       $yAxisStart = $_->used;
  28.     }
  29.     if ($_->target_used && $_->target_used < $yAxisStart) {
  30.       $yAxisStart = $_->target_used;
  31.     }
  32.     if ($_->limit && $_->limit < $yAxisStart) {
  33.       $yAxisStart = $_->limit;
  34.     }
  35.     if ($parameter{"projection"} && $_->projection_used && $_->projection_used < $yAxisStart) {
  36.       $yAxisStart = $_->projection_used;
  37.     }
  38.   }


 
bien entendu, je cherche un moyen efficace pour réduire ca le plus possible et que ca reste clair
 
si quelqu'un a une idée, merci

Reply

Marsh Posté le 03-05-2004 à 17:22:30   

Reply

Marsh Posté le 03-05-2004 à 17:44:17    

deja si tu pouvais acceder directement à la hash au lieu de passer par des methodes ca accelererait beaucoup la chose
 
sinon tu peux deja faire un truc genre
 
$max_local = max($_->bidule, $_->truc, $_->machin);
$max = $max_local if $max < $max_local;

Reply

Marsh Posté le 03-05-2004 à 17:54:53    

en faisant deux sorts sur @_ ( un pour le max et un pour le min) et en prenant le 1er element remonté ???


Message édité par anapajari le 03-05-2004 à 17:55:15
Reply

Marsh Posté le 03-05-2004 à 18:32:46    

anapajari a écrit :

en faisant deux sorts sur @_ ( un pour le max et un pour le min) et en prenant le 1er element remonté ???


 
ouais c'est la solution que j'ai pensé ce midi (12hrs30 ici présentement)
 
j'allais testé justement


Message édité par burgergold le 03-05-2004 à 18:33:47
Reply

Marsh Posté le 03-05-2004 à 18:38:47    

anapajari a écrit :

en faisant deux sorts sur @_ ( un pour le max et un pour le min) et en prenant le 1er element remonté ???


 
ah en fait, @_ contient des objets, pas des valeurs brutes

Reply

Marsh Posté le 03-05-2004 à 18:47:02    

le sort semble pas fonctionner
 
j'ai tenté un truc du genre :D
 

Code :
  1. my @array1 = qw(2 3 4 5);
  2. my @array2 = qw(6 7 8 9 10);
  3. my @array3 = qw(1 7 8 9 10);
  4. print ((sort {$a cmp ((sort ($a cmp $b) @array2)[0])} @array1)[0]);


 
 
ta fonction max tu la prends ou? je l'ai pas par défaut, faut surement que je load un module quelconque non?


Message édité par burgergold le 03-05-2004 à 18:51:26
Reply

Marsh Posté le 03-05-2004 à 20:41:15    

Burgergold a écrit :

ah en fait, @_ contient des objets, pas des valeurs brutes


et alors?
tu déclares un sort dans ce gout la

Code :
  1. sub mysort {
  2.           $a->letrucacomparer <=> $b->letrucacomparer;
  3.   }


et derriere tu fais

Code :
  1. foreach( sort mysort @_ )


 
[edit: en fait je viens de comprendre que tu ne veux pas la plus grande et la plus petite valeur de tous tes objets mais que tu veux la plus grande valeur et la plus petite valeur de chaque objet... donc je sors :D]


Message édité par anapajari le 03-05-2004 à 20:44:58
Reply

Marsh Posté le 04-05-2004 à 02:12:02    

anapajari a écrit :

et alors?
tu déclares un sort dans ce gout la

Code :
  1. sub mysort {
  2.           $a->letrucacomparer <=> $b->letrucacomparer;
  3.   }


et derriere tu fais

Code :
  1. foreach( sort mysort @_ )


 
[edit: en fait je viens de comprendre que tu ne veux pas la plus grande et la plus petite valeur de tous tes objets mais que tu veux la plus grande valeur et la plus petite valeur de chaque objet... donc je sors :D]


 
ouais mais mon sort mysort doit pas m'en vérifier que 2 mais environ 5, et jdois pas prendre les valeurs nulles :D
 
donc ca me donnera surment une fonction et non réellement une manière "plus rapide" de le faire, right?


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 04-05-2004 à 12:17:49    

up
 
et justement dans mysort, comment jvais faire pour plugger toutes les comparaisons et que sort sachent quoi faire :D


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed