2011-03-13 8 views
7

Considere el siguiente bloque de datos, ¿cómo puedo mantener ordenado la matriz en el tercer campo y seguir presionando ítems?Insertar Perl en una matriz ordenada

$VAR1 = [ 
      '1111', 
      'http://...', 
      3  #this is one of the 3rd field mentioned above 
     ]; 
$VARN = [ 
      '5555', 
      'http://...', 
      0 
     ]; 


Mi código es el siguiente:

my @curItem = ($item->{id}, $item->{href}, getTotal($item->{id})); 
push @items, \@curItem; 

que he encontrado módulo this que es similar a lo que necesito.

Cualquier ayuda apreciada.

Respuesta

8

Puede utilizar ese módulo, sólo tiene que suministrar el tipo:.

tie @a, "Tie::Array::Sorted", sub { $_[0]->[2] <=> $_[1]->[2] };

(O algo por el estilo ... Voy a tener que comprobarlo Básicamente, es necesario ordenar en función del elemento de la matriz ref que está pasando)

Editar: Sí, esto funciona para sus datos. Acaba de comprobar que:

use Tie::Array::Sorted; 

tie @a, "Tie::Array::Sorted", sub { $_[0]->[2] <=> $_[1]->[2] }; 

push @a, [ "1111", "http:// ...", 3]; 
push @a, [ "5555", "http:// ...", 0]; 

foreach $ref (@a) 
{ 
    print $ref . "\n"; 
    print "@$ref \n"; 
} 

Salidas:

ARRAY(0x9130888) 
5555 http:// ... 0 
ARRAY(0x90dd818) 
1111 http:// ... 3 
3

Bueno, empujar va a añadir el elemento al final de la lista de no importa qué. Es una operación de pila. Diría que probablemente sería mejor usar una estructura de datos diferente, como un hash y luego solo clasificar por clave o valor cuando sea necesario. Sin más detalles de lo que estás tratando de escribir, es difícil de decir.

De lo contrario, tendrá que escribir una subrutina que busca en la lista el mejor lugar de inserción y luego usa el empalme para insertar el elemento en su lugar. Esto suena más como lo que quiere hacer, pero no estoy seguro de que sea particularmente eficiente, ya que tiene que buscar en la lista el punto de inserción cada vez que quiera agregar un artículo mientras mantiene un orden ordenado.

+0

De acuerdo. La pregunta es preguntar por algo lógicamente inconsistente; no se puede mantener una matriz en una orden clasificada * y * 'presionar' en particular porque 'push', por definición, almacena los artículos en función del orden en que se agregaron, no en función de su contenido. En cuanto a la eficacia de hacer inserciones clasificadas, ordenar los datos en la inserción es una de las formas más rápidas de ordenarlo, además, evita la necesidad de reordenar cada vez que accede a los datos, por lo que sería una victoria sobre la ordenación. acceso en la abrumadora mayoría de los casos. –

1

Si va a añadir más de una referencia a un array de @items, añadir las referencias en primer lugar, a continuación, utilizar un Schwartzian Transformar para realizar una única operación de ordenación:

@items = map $_->[1], sort { $a->[0] <=> $b->[0] } map { [ $_->[2], $_ ] } @items; 

Randal escribió una columna acerca de esto: http://www.stonehenge.com/merlyn/UnixReview/col64.html

Cuestiones relacionadas