Clasificación de hash en Perl

Requisito previo: Perl | Hachís

El conjunto de pares clave/valor se llama Hash. Cada clave en una estructura hash es única y de tipo strings. Los valores asociados con estas claves son escalares. Estos valores pueden ser un número, una string o una referencia. Un Hash se declara usando mi palabra clave. Consideremos un ejemplo para comprender el concepto de clasificación del hash.

Ejemplo: Considere un hash con los nombres de los estudiantes en una clase y con su puntaje promedio. Aquí, el nombre de los estudiantes son las claves y sus puntajes promedio son los valores. Imprima este hash usando el bucle foreach en los nombres de los estudiantes devueltos por la keys función.

# Perl program to demonstrate 
# the concept of hash
use strict;
use warnings;
use 5.010;
  
# Creating a hash of studentnames 
# and their average score
my %studentnames = (
Martha => 14,
Vivek => 27,
Earl => 31,
Marty => 16.5,
Jason => 25.2,
Socrates => 29.5,
Uri => 19.6,
Nitin => 30,
Plato => 39,
);
  
# displaying the keys and values of Hash
# using the foreach loop and keys function 
# output may be different each 
# time when you run the code
foreach my $name (keys %studentnames) {
      
    # printing the keys and values of hash
    printf "%-8s %s\n", $name, $studentnames{$name};
}

Producción:

Marty    16.5
Jason    25.2
Plato    39
Vivek    27
Socrates 29.5
Martha   14
Earl     31
Uri      19.6
Nitin    30

Nota: La salida puede contener cualquier orden aleatorio según el sistema y la versión de Perl.

Los hashes se pueden ordenar de muchas maneras de la siguiente manera:

  • Clasificación del hash según los valores ASCII de sus claves: generalmente, la clasificación se basa en la tabla ASCII. Significa que la clasificación mantendrá todas las letras mayúsculas delante de todas las letras minúsculas. Este es el comportamiento predeterminado de la clasificación. El código de ejemplo anterior está ordenado según los valores ASCII de sus claves.
  • Ordenar el Hash según el orden alfabético de sus claves: Aquí, las claves se ordenan alfabéticamente.

    Ejemplo:

    # Perl program to demonstrate 
    # sorting of the hash according 
    # alphabetical order of its keys
    use strict;
    use warnings;
    use 5.010;
      
    # Creating a hash of studentnames 
    # and their average score
    my %studentnames = (
    Martha => 14,
    Vivek => 27,
    Earl => 31,
    Marty => 16.5,
    Jason => 25.2,
    Socrates => 29.5,
    Uri => 19.6,
    Nitin => 30,
    Plato => 39,
    );
      
    # sorting the hash according 
    # alphabetical order of its keys
    foreach my $name (sort {lc $a cmp lc $b} keys %studentnames
    {
        printf "%-8s %s\n", $name, $studentnames{$name};
    }

    Producción:

    Earl     31
    Jason    25.2
    Martha   14
    Marty    16.5
    Nitin    30
    Plato    39
    Socrates 29.5
    Uri      19.6
    Vivek    27
    
  • Clasificación según los valores de hash: también puede clasificar el hash según los valores de hash de la siguiente manera:

    Ejemplo 1: Ordenar los valores hash según la tabla ASCII.

    # Perl program to demonstrate 
    # sorting of the hash according
    # to the values of Hash
    use strict;
    use warnings;
    use 5.010;
      
    # Creating a hash of studentnames 
    # and their average score
    my %studentnames = (
    Martha => 14,
    Vivek => 27,
    Earl => 31,
    Marty => 16.5,
    Jason => 25.2,
    Socrates => 29.5,
    Uri => 19.6,
    Nitin => 30,
    Plato => 39,
    );
      
    # sorting of the hash according
    # to ASCII code of values of Hash
    foreach my $name (sort values %studentnames
    {
        say $name;
    }

    Producción:

    14
    16.5
    19.6
    25.2
    27
    29.5
    30
    31
    39
    

    Ejemplo 2: Clasificación según el valor numérico de Valores de hash de la siguiente manera:

    # Perl program to demonstrate 
    # sorting of the hash according
    # to the values of Hash
    use strict;
    use warnings;
    use 5.010;
      
    # Creating a hash of studentnames 
    # and their average score
    my %studentnames = (
    Martha => 14,
    Vivek => 27,
    Earl => 31,
    Marty => 16.5,
    Jason => 25.2,
    Socrates => 29.5,
    Uri => 19.6,
    Nitin => 30,
    Plato => 39,
    );
      
    # sorting of the hash according
    # to the numerical value of
    # Values of hash
    foreach my $name (sort {$a<=>$b} values %studentnames
    {
        say $name;
    }

    Producción:

    14
    16.5
    19.6
    25.2
    27
    29.5
    30
    31
    39
    
  • Ordenar las claves del hash según los valores: También puede ordenar las claves del hash según los valores dados.

    Ejemplo 1: En el siguiente programa, <=> se denomina operador de la nave espacial . Si ejecuta el código una y otra vez, puede notar la diferencia en la salida. A veces encuentras a Platón antes que Nitin y viceversa.

    # Perl program to demonstrate the
    # Sorting of keys of the hash 
    # according to the values
    use strict;
    use warnings;
    use 5.010;
      
    # Creating a hash of studentnames 
    # and their average score
    my %studentnames = (
    Martha => 14,
    Vivek => 27,
    Earl => 31,
    Marty => 16.5,
    Jason => 25.2,
    Socrates => 29.5,
    Uri => 19.6,
    Nitin => 45,
    Plato => 45,
    );
      
    # Sort the keys of the hash
    # according to the values
    # Here $a and $b are the 
    # placeholder variable of sort
    foreach my $name (sort {$studentnames{$a} <=> 
           $studentnames{$b}} keys %studentnames
    {
        printf "%-8s %s\n", $name, $studentnames{$name};
    }

    Producción:

    Martha   14
    Marty    16.5
    Uri      19.6
    Jason    25.2
    Vivek    27
    Socrates 29.5
    Earl     31
    Plato    45
    Nitin    45
    

    Ejemplo 2: para resolver el código anterior, las claves que tienen los mismos valores se pueden ordenar de acuerdo con la tabla ASCII de la siguiente manera:

    # Perl program to demonstrate the
    # Sorting of keys of the hash 
    # according to the values
    use strict;
    use warnings;
    use 5.010;
      
    # Creating a hash of studentnames 
    # and their average score
    my %studentnames = (
    Martha => 14,
    Vivek => 27,
    Earl => 31,
    Marty => 16.5,
    Jason => 25.2,
    Socrates => 29.5,
    Uri => 19.6,
    Nitin => 45,
    Plato => 45,
    );
      
    # keys that have the same value 
    # will be sorted according the 
    # ASCII table
    foreach my $name (sort { $studentnames{$a} <=> $studentnames{$b} or
                                    $a cmp $b } keys %studentnames) {
        printf "%-8s %s\n", $name, $studentnames{$name};
    }

    Producción:

    Martha   14
    Marty    16.5
    Uri      19.6
    Jason    25.2
    Vivek    27
    Socrates 29.5
    Earl     31
    Nitin    45
    Plato    45
    

    Explicación: Aquí puede ver que las claves Nitin y Plato están ordenadas según la tabla ASCII. No importa cuántas veces ejecute el código, el resultado seguirá siendo el mismo.

Publicación traducida automáticamente

Artículo escrito por Bhashkar_P y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *