2012-05-22 13 views
10

Ich habe ein Array mit Werten 33, 32, 8, 100.Wie finden Sie den maximalen und minimalen Wert in einem Array von ganzen Zahlen in Perl?

Wie kann ich den maximalen und minimalen Wert in diesem Array finden?

Muss ich spezielle Bibliotheken hinzufügen?

+4

Ist das Hausaufgaben? Was hast du probiert? –

+2

Wie wäre es mit einem Googlen? – jm666

+1

Es ist in Ordnung, hier einfache Fragen zu SO zu haben, da die kuratierten Antworten letztendlich viel besser sind als das, was Sie beim Googlen finden können. –

Antwort

25

List::Util 's min und max sind in Ordnung,

use List::Util qw(min max); 
my $min = min @numbers; 
my $max = max @numbers; 

Aber List::MoreUtils' s minmax ist effizienter, wenn Sie sowohl die min und max müssen (weil es weniger Vergleiche der Fall ist).

use List::MoreUtils qw(minmax); 
my ($min, $max) = minmax @numbers; 

Liste :: Util ist Teil des Kerns, aber List :: MoreUtils ist nicht.

19

können Sie List::Util verwenden, um dies leicht zu tun, zum Beispiel.

use List::Util qw(min max); 
my @arr = (33, 32, 8, 100); 
print min(@arr)," ", max(@arr), "\n"; 
+2

+1, weil diese Antwort durch selbsterklärenden Code unterstützt wird. :) – verisimilitude

0

Verwenden Sie die List::Util module, das ist es empfehlenswert, mit ohnehin kennen zu lernen, so wie List::MoreUtils:

D:\ :: perl -MList::Util=max -lwe "print max 324, 43, 53, 3532, 43" 
3532 

D:\ :: perl -MList::Util=min -lwe "print min 324, 43, 53, 3532, 43" 
43 
0

List::Util hat die „max“ und „min“ Funktionen, die Sie direkt verwenden können, finden das Maximum und das Minimum, das eine Liste der Zahlen gegeben wird. Überprüfen Sie, ob Sie das verwenden können. Sie können auch das Array sortieren und dann die höchste und niedrigste Nummer bestimmen

1

Sie sollten verwenden, die mit der Perl-Distribution seit v5.7.3 freigegeben wurde, also wahrscheinlich nicht installieren müssen.

use strict; 
use warnings; 

use feature 'say'; 

use List::Util qw/ max min /; 

my @data = (33, 32, 8, 100); 

say min @data; 
say max @data; 

Ausgang

8 
100 
10

Die zur Verfügung gestellten Lösungen sind gut, aber wenn man es umsetzen wollen selbst es ist ziemlich einfach:

use strict; 
use warnings; 

my @array = (33, 32, 8, 100); 
my ($min, $max); 

for (@array) { 
    $min = $_ if !$min || $_ < $min; 
    $max = $_ if !$max || $_ > $max 
}; 

print "min: $min\n"; 
print "max: $max\n"; 
17

Ohne Module:

#!/usr/bin/perl 
use strict; 
use warnings; 
my @array = sort { $a <=> $b } qw(33 32 8 100); 
print "min: $array[0]\n"; 
print "max: $array[-1]\n"; 
+2

Dies verbringt ein wenig Zeit mit der Bestellung von Werten, die zwischen den Min & Max liegen, die es möglicherweise bereits erreicht hat, wobei O (N log N) Zeit genommen wird, wenn es nur O (N) Zeit braucht. – hepcat72

1

Natürlich, wenn Sie sowohl den Höchst- als auch den Minimalwert einer Liste gleichzeitig haben möchten, ist es effizienter, beide auf einmal zu holen; es müssen nur 3 Ordnungsvergleiche pro 2 Datenelemente statt 4 durchgeführt werden. Dies kann von Bedeutung sein, wenn die Datensätze groß genug sind.

List::Util bietet keine minmax Funktion, aber List::MoreUtils tut.

use strict; 
use warnings; 
use feature qw(say); 

use List::MoreUtils qw(minmax); 

my ($min, $max) = minmax @data; 

say $min; 
say $max; 
+0

Eigentlich habe ich gerade gesehen, dass Ikegami bereits die 'List :: MoreUtils'-Antwort gegeben hat. Entschuldigung für den Betrogenen. – LeoNerd

1

Für Zahlen:

my ($min,$max) = (sort {$a <=> $b} @array)[0,-1]; 

Für Streicher:

my ($min,$max) = (sort {$a cmp $b} @array)[0,-1]; 
2

Sie Karte verwenden, um dies zu tun, ohne Bibliotheken benötigt:

my @array = (33, 32, 8, 100); 
my ($max,$min)=(-1e99,1e99); # Initialize to values outside anything in your list 
map {$max=$_ if ($_>$max); $min=$_ if($_<$min);} @array; 
print "max=$max, min=$min\n"; 
Verwandte Themen