Ordinare un array

a=Dir[’/prova’]
ottengo nell’array a tutti i files contenuti nella directory /prova.
Tali files sono del tipo: file.1.gz, file.2.gz, file.100.gz,
file.102.gz,
ecc. fino al 1330.
Nellì’array me li ritrovo cosi’ come vengono letti dalla directory e cioe’
file.1.gz, file.100.gz, file.102.gz, file.2.gz
Poiche’ dovro’ poi leggere tali file secondo l’ordine dato dalla seconda
estensione dovrei prima poterli ordinare in tal modo all’interno
dell’array.
Come si possono ordinare in modo che risultino file.1.gz, file.2.gz,
file.100.gz, file.102.gz, ecc.?

On Jan 10, 2008 7:09 AM, Mauro [email protected] wrote:

Come si possono ordinare in modo che risultino file.1.gz, file.2.gz,
file.100.gz, file.102.gz, ecc.?

Usa NaturalSort: http://rubyforge.org/projects/naturalsort/

Ciao,
Antonio

http://stacktrace.it - Aperiodico di resistenza informatica.
http://antoniocangiano.com - Zen and the Art of Ruby P.ming
http://math-blog.com - Math Blog: Mathematics is wonderful!
http://effettofarfalla.com - Il battito d’ali di un italiano a Toronto

e’ l’unica soluzione questa?

Se il nome dei files rispecchia sempre lo schema che hai detto, puoi
provare cosi’:

a.sort_by {|f| /.+.(\d+).gz/.match(f)[1].to_i }

Dai un’occhiata a questi due metodi:

Enumerable#sort
Enumerable#sort_by

2008/1/10, Mauro [email protected]:

2008/1/10 Claudio Petasecca D. [email protected]:

Se il nome dei files rispecchia sempre lo schema che hai detto, puoi
provare cosi’:

a.sort_by {|f| /.+.(\d+).gz/.match(f)[1].to_i }

me la potresti spiegare?
scusa l’ignoranza.

Mauro wrote:

2008/1/10 Claudio Petasecca D. [email protected]:

Se il nome dei files rispecchia sempre lo schema che hai detto, puoi
provare cosi’:

a.sort_by {|f| /.+.(\d+).gz/.match(f)[1].to_i }

me la potresti spiegare?
scusa l’ignoranza.

L’espressione regolare /.+.(\d+).gz/ seleziona un gruppo di cifre
(\d+) contenute tra “.” e un “.gz”
Il metodo Regex::match, usato con un blocco, applica il blocco al
pattern selezionato (il gruppo di cifre).

Il costrutto sort_by ordina un’enumeration secondo quello che si ottiene
dal blocco che segue, e il blocco riporta l’intero che il gruppo di
cifre rappresenta.

E scusa il ritardo

Ok, grazie, l’ho provato pero’ non funziona.

2008/1/17 Claudio Petasecca D. [email protected]:

Strano a me funziona.
Ti porto l’intero (!) sorgente:

a = Dir[‘prova/’]
puts a.join(",")
puts
a = Dir['prova/
’].sort_by {|f| /.+.(\d+).gz/.match(f)[1].to_i }
puts a.join(",")

e l’output:

prova/file.100.gz,prova/file.101.gz,prova/file.102.gz,prova/file.15.gz,prova/file.200.gz,prova/file.201.gz,prova/file.202.gz,prova/file.5.gz,prova/file.99.gz

prova/file.5.gz,prova/file.15.gz,prova/file.99.gz,prova/file.100.gz,prova/file.101.gz,prova/file.102.gz,prova/file.200.gz,prova/file.201.gz,prova/file.202.gz