Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371

    Ordinare una lista di file

    Problema simile ma non identico a quello proposto su questo tred .

    Ho una lista di file, in un arrar ( File output[] ), e devo mostrarla all'utente correttamente sortata.

    i file hanno tutti nomi tipo

    Nome1
    Nome2
    ...
    Nome10
    Nome11

    etc.

    Presi come sono sulla directory, mi vengono visualizzati così:
    Nome1
    Nome10
    ...
    Nome19
    Nome2
    Nome20

    etc..

    Ora le mie domande sono due:
    1) i nomi così sono già sortati o è un caso che vengano proprio in questo modo?
    2) come posso fare per sortarli in modo più 'user friendly' (ovvero, Nome1, Nome2 etc)?

    Ovviamente cerco un metodo che mi permetta di evitarmi di scrivere una procedua adattata del classicissimo bubble sort

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Il problema fondamentale è che i nomi dei file non sono costruiti nel modo corretto.
    File20 verrà sempre prima di File3 (anche nel sistema operativo!!), perchè questo è l'ordinamento lessicografico delle stringhe.

    Se i nomi dei file fossero scritto in modo "furbo" sarebbero così:

    File01
    File02
    ...
    File10
    File11

    E sarebbero ordinabili lessicograficamente.

    Per ordinarli nel modo "corretto" (umanamente parlando) hai un'unica strada: scrivere un metodo ad hoc per l'ordinamento.

    Questo lo puoi fare sostanzialmente in due modi:
    1) Scrivendo effettivamente il codice dell'algoritmo di ordinamento
    2) Ingannando l'algoritmo normale, facendogli credere che l'oggetto che sta ordinando sia diverso da quello che realmente è.

    Io ti consiglio la seconda strada: è un po' più facile e si scrive meno codice.

    Per attuarla è sufficiente estendere la classe File facendo l'override del metodo compareTo() in modo da cercare di "uniformare" il nome del file. In questo caso potresti semplicemente prendere il nome del file, togliere di mezzo la parte iniziale (hai detto che si chiamano tutto "Filexx", quindi togliendo di mezzo la parte "File"), convertire in numero la seconda parte e restituire il valore di confronto fra quei numeri.

    codice:
    public int compareTo(Object o) {
       File f = (File) o;
       // I file si chiamano tutti "FileXX": tolgo la scritta "File" e ottengo il numero XX
       String numeroThis = getName().substring(4, getName().length());
       String numeroObj = o.getName().substring(4, o.getName().length());
       int numThis = Integer.parseInt( numeroThis );
       int numObj = Integer.parseInt( numeroObj );
       return (numThis - numObj);
    }
    Lo stesso per il compareTo() che prende un oggetto File (non devi fare alcun cast all'inizio).

    A questo punto puoi creare un array di oggetti della tua classe a partire dagli elementi di tipo File che hai nell'array e utilizzare Arrays.sort() per l'ordinamento.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    lele, SEI UN GENIO!

    Se non ci fossi tu bisognerebbe inventarti.

    Grazie 1000

    (un giorno o l'altro ti offro una cena )

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 © 2025 vBulletin Solutions, Inc. All rights reserved.