Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Alberto
    Registrato dal
    Oct 2004
    Messaggi
    1,870

    convertire una stringa in un numero

    Ho una tabella hash con nomi ed età, se dalla tabella estraggo le chiavi e i valori e li metto in un 2 array, l'array contenente i valori è in formato stringa.

    Quando poi faccio l'ordinamento in base a i valori dal più grande al più piccolo, 20 è più grande di 21 perchè ovviamente in formato stringa 0 viene prima di 1.

    Dovrei convertire l'array dei valori da stringa a numerico è possibile?

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    C'e` quacosa che non quadra.
    Nell'ordine ASCII lo zero (0x30 = 48) viene prima dell'1 (0x31 = 49).

    Il problema e` che il 10 viene prima del 9 (e cosi` per molti numeri con diverso numero di cifre). In tal caso devi far scrivere anche lo zero prima del 9 (si riesce con il printf/sprintf).

    Non so bene cosa vuoi fare, ma credo che ti convenga tenere le hash come hash, ed ordinarle con una routine di ordinamento specifica (devi fartela tu), che va a testare il "campo" che ti interessa.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Utente di HTML.it L'avatar di Alberto
    Registrato dal
    Oct 2004
    Messaggi
    1,870
    Ho questa tabella di hash da ordinare in base all'età
    Codice PHP:
    %eta=( Alberto => 28,
               
    Stefano => 31,
               
    Luca => 20,
               
    Sandro => 21);

    @
    keys(%eta);
    @
    values(%eta);

    $n=$#k;
    $p=$n;

    do
    {
    $scambio=0;
    for(
    $i=0;$i<($n-1);$i++){
    if(
    $v[$i] < $v[$i+1]){
       
    $app=$v[$i];
       
    $app1=$k[$i];
       
    $v[$i]=$v[$i+1];
       
    $k[$i]=$k[$i+1];
       
    $v[$i+1]=$app;
       
    $k[$i+1]=$app1;
       
    $scambio=1;
       
    $p=$i+1;
    }
    $n=$p;
    }
    }
    while(
    $scambio==0);

    print
    "@k\n";
    print
    "@v\n"
    In questo modo funziona, l'unico problema è che i valori non sono numeri ma stringhe e quindi il 20 viene prima del 21.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Adesso e` un po' che non uso piu` Perl, ma mi pare che le hash non possano venir ordinate.
    Puoi ordinare una matrice, ma non un hash.
    Cioe`: l'ordine della hash e` una cosa interna al programma, ma su cui non puoi farci conto.
    La hash serve per trovare un valore data la chiave.

    Comunque prova a dare in ingresso piu` dati e con ordine diverso, e vedi poi se noti lo stesso problema (che tu hai attribuito all'ordinamento ASCII, ma che io non ritengo corretto).

    Invece puoi ordinare un vettore.
    Quindi dovresti prima copiare la hash in un vettore (nel tuo caso vettore di vettori, ovvero matrice a due indici) e poi ordinare il vettore esterno.
    Inoltre se usi la funzione sort, e` sicuramente piu` performante, rispetto alla tua funzione di ordinamento.

    PS: credo che ti convenga usare lo strict, e fare in modo che eventuali warning ti vengano segnalati: le variabili tu non le dichiari, e questo ti puo` anche portare a problemi "strani" di cui non riesci poi a capire la sorgente.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Utente di HTML.it L'avatar di Alberto
    Registrato dal
    Oct 2004
    Messaggi
    1,870
    Originariamente inviato da Mich_
    Adesso e` un po' che non uso piu` Perl, ma mi pare che le hash non possano venir ordinate.
    Puoi ordinare una matrice, ma non un hash.
    Cioe`: l'ordine della hash e` una cosa interna al programma, ma su cui non puoi farci conto.
    La hash serve per trovare un valore data la chiave.

    Comunque prova a dare in ingresso piu` dati e con ordine diverso, e vedi poi se noti lo stesso problema (che tu hai attribuito all'ordinamento ASCII, ma che io non ritengo corretto).
    Nell'hash il valore che fa riferimento alla chiave è di tipo stringa, quindi quando estraggo le chiavi e le metto in un array avrò un array che non è @array=(10,11,12) ma @array=("10",11","12");

    Invece puoi ordinare un vettore.
    Quindi dovresti prima copiare la hash in un vettore (nel tuo caso vettore di vettori, ovvero matrice a due indici) e poi ordinare il vettore esterno.
    Inoltre se usi la funzione sort, e` sicuramente piu` performante, rispetto alla tua funzione di ordinamento.
    %eta=( Alberto => 28,
    Stefano => 31,
    Luca => 20,
    Sandro => 21);

    @k = keys(%eta);
    @v = values(%eta);
    estrando le chiavi e i valori in due array la posizione 0 di @k è Alberto, la posizione 0 di @v è 28, la 1 @k è Stefano e la 1 di @v è 31 e così via, quindi se ordino con sort @v mi perdo la corrispondenza, perchè alla posizione 0 dell'array valori non corrisponderà più la più posizione 0 dell'array chiavi e quindi l'unico modo in cui potrei riordinare tutto è estrarre le chiavi corrispondenti dalla tabella di hash, ma in questo caso non so come fare, per questo avevo adottato una specie di bubblesort

    PS: credo che ti convenga usare lo strict, e fare in modo che eventuali warning ti vengano segnalati: le variabili tu non le dichiari, e questo ti puo` anche portare a problemi "strani" di cui non riesci poi a capire la sorgente.
    Ok, userò lo strict, ma in perl le variabili non devono essere dichiarate.
    Non ho problemi strani, so benissimo da cosa deriva, cioè ordinamento di un array con numeri in formato stringa.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Se leggi bene, non ti ho consigliato di usare due vettori, ma di usare un vettore di vettori. Non e` la stessa cosa.

    Non e` vero che in Perl le variabili non si devono dichiarare. Si devono dichiarare; pero` il Perl ti permette anche lo "spaghetti-code", che in Perl puo` diventare pericoloso.

    Ti assicuro che in ASCII il carattere 0 viene prima del carattere 1 a sua volta prima del 2 ecc. Se invece usi una codifica diversa dall'ASCII potrebbe essere, ma non conosco nessun sistema che usa codifiche diverse (ci sono invece varie estensioni dell'ASCII, ma si basano tutte sull'ASCII a 7 bit, dove sono compresi i caratteri numerici). Sempre che non hai scritto lo 0 (zero) usando il carattere O (o maiuscola), nel qual caso la cosa diventa assurda, per cui non lo credo.

    Vediamo se shishii passa di qua: lui ha sicuro sottomano (o in testa) il modo di fare corretto. Io dovrei andare a spulciare roba di qualche anno fa.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  7. #7
    Utente di HTML.it L'avatar di Alberto
    Registrato dal
    Oct 2004
    Messaggi
    1,870
    Originariamente inviato da Mich_
    Se leggi bene, non ti ho consigliato di usare due vettori, ma di usare un vettore di vettori. Non e` la stessa cosa.

    Non e` vero che in Perl le variabili non si devono dichiarare. Si devono dichiarare; pero` il Perl ti permette anche lo "spaghetti-code", che in Perl puo` diventare pericoloso.

    Ti assicuro che in ASCII il carattere 0 viene prima del carattere 1 a sua volta prima del 2 ecc. Se invece usi una codifica diversa dall'ASCII potrebbe essere, ma non conosco nessun sistema che usa codifiche diverse (ci sono invece varie estensioni dell'ASCII, ma si basano tutte sull'ASCII a 7 bit, dove sono compresi i caratteri numerici). Sempre che non hai scritto lo 0 (zero) usando il carattere O (o maiuscola), nel qual caso la cosa diventa assurda, per cui non lo credo.

    Vediamo se shishii passa di qua: lui ha sicuro sottomano (o in testa) il modo di fare corretto. Io dovrei andare a spulciare roba di qualche anno fa.
    Mi sa che mi ero espresso male io , ma anch'io intendevo che che lo 0 viene prima dell'uno e così via (devo rileggere meglio i post prima di inviarli )

    Quella dei due vettori era una mia idea ancora prima di postare il problema, se ho fatto intendere che me l'avevi suggeri tu, chiedo venia

  8. #8
    Come recita perlfaq4 (http://pod2it.sourceforge.net/pods/perlfaq4.htm):

    Come si ordina un hash (opzionalmente per valore invece che per chiave)?

    Internamente, gli hash sono memorizzati in un modo che impedisce l'imposizione di un ordinamento sulle coppie chiave-valore. Si deve invece ordinare una lista delle chiavi o dei valori:

    @chiavi = sort keys %hash; # ordinato per chiave
    @chiavi = sort {

    $hash{$a} cmp $hash{$b}
    } keys %hash; # e per valore

    Qui sotto facciamo un ordinamento numerico inverso per valore e, se due chiavi sono identiche, un ordinamento per lunghezza della chiave oppure, se anch'esso fallisse, per un'esplicita comparazione ASCII delle chiavi (beh, può darsi venga modificata dal vostro locale, consultate perllocale).

    @chiavi = sort {
    $hash{$b} <=> $hash{$a}
    ||
    length($b) <=> length($a)
    ||
    $a cmp $b
    } keys %hash;
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.