Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    457

    Ordinare una lista di mesi

    salve a tutti,
    mi trovo davanti alla seguente difficoltà:

    ho una lista di stringhe:

    List<String> lista_mesi

    che contiene i mesi dell'anno

    vorrei ordinare la lista a partire da mese piu grande sino al mese piu piccolo

    ad esempio se la lista contiene:

    list={marzo,settembre, dicembre}

    vorrei trasformarla nella seguente lista:
    list={dicembre,settembre,marzo}

    chi mi puo' aiutare?
    avete qualche idea ? grazie mille

  2. #2
    La soluzione migliore che mi viene in mente è quella di definire una classe Mese:
    codice:
    public class Mese{
         private int numero;
         private String nome;
    
         public Mese(int numero, String nome){
               this.numero = numero;
               this.nome = nome;
         }
    
         //metodi...
    }
    Dunque adesso hai una lista di oggetti della classe Mese:
    codice:
    List<Mese> listOfMonths = ... ;
    Per poter ordinare questa lista ti consiglio di usare la classe statica Collections ed in particolare il metodo sort.
    Inoltre devi definire un Comparatore per la classe Mese affinchè il metodo sort possa funzionare correttamente.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    una cosa che mi viene in mente: se invece di usare una classe Mese così fatta si definisce una enum??

  4. #4
    Originariamente inviato da valia
    una cosa che mi viene in mente: se invece di usare una classe Mese così fatta si definisce una enum??
    Si, come soluzione va bene.
    Però in quel caso si deve per forza implementare un comparatore e quindi non si potrebbe considerare l'idea di rendere il Mese un oggetto comparabile.
    Se avessi indicato la seconda come soluzione, per le enum non si sarebbe aperto alcun spiraglio per poter essere prese in considerazione.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2010
    Messaggi
    457
    mi scrivete un frammento di codice?
    non l'ho mai usata la classe di enumerazione..
    grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    di frammenti di codice sulle enum ce ne sono a bizzeffe in rete (e anche sul tutorial oracle).
    Al massimo la difficoltà è farne l'ordinamento, ma anche in quel caso devi dare un minimo di informazioni al comparatore indicando per COSA fare l'ordinamento, cosa non possibile in modo semplice con le enum (e qui correggetemi se sbaglio)

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Io vedrei bene anche una class Mese fatta in modo diverso.
    All'utente interessa solo e soltanto il "nome" del mese e gli interessa che essi vengano ordinati secondo l'usuale ordine cronologico.

    Quindi, ridurrei il costruttore al solo nome del mese e manterrei completamnte nascosto all'interno il meccanismo di ordinamento (a livello di classe). E farei di più: farei in modo che i mesi possano "auto-ordinarsi", facendo implementare Comparable.

    Questo è solo un abbozzo:

    codice:
    import java.util.*;
    
    public class Mese implements Comparable<Mese> {
    
       private static final HashMap<String,Integer> mesi = new HashMap<String,Integer>();
    
       // Il blocco statico di inizializzazione serve a valorizzare la mappa che mi permetterà
       // di effettuare gli ordinamenti.
       static {
          mesi.put("GENNAIO",0);
          mesi.put("FEBBRAIO",1);
          mesi.put("MARZO",2);
          mesi.put("APRILE",3);
          mesi.put("MAGGIO",4);
          mesi.put("GIUGNO",5);
          mesi.put("LUGLIO",6);
          mesi.put("AGOSTO",7);
          mesi.put("SETTEMBRE",8);
          mesi.put("OTTOBRE",9);
          mesi.put("NOVEMBRE",10);
          mesi.put("DICEMBRE",11);
       }
    
       private String nome;
    
       public Mese(String nome) {
          this.nome = nome;
       }
    
       @Override
       public String toString() { return nome; }
    
       @Override
       public int hashCode() { return 17 * nome.toUpperCase().hashCode(); }
    
       @Override
       public boolean equals(Object obj) {
          boolean ret = false;
          if (obj instanceof Mese) {
             Mese m = (Mese) obj;
             ret = this.nome.toUpperCase().equals(m.nome.toUpperCase());
          }
          return ret;
       }
    
       public int compareTo(Mese obj) {
          return mesi.get(nome.toUpperCase()) - mesi.get(obj.nome.toUpperCase());
       }
    }
    Così facendo, non solo lascio all'utente la possibilità di scrivere il nome del mese come gli pare (maiuscolo, minuscolo, con l'iniziale, ecc), ma gli permetto di effettuare velocemente gli ordinamenti:

    codice:
    List<Mese> lista = new ArrayList<Mese>();
    
    lista.add( new Mese("Luglio") );
    lista.add( new Mese("MARZO") );
    lista.add( new Mese("maggio") );
    
    // All'ordinamento lasciamo che ci pensi Collections, sfruttando il "natural-order"
    // indotto proprio dal nostro Comparable
    Collections.sort( lista );
    
    System.out.println( lista );
    "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

  8. #8
    Originariamente inviato da LeleFT
    E farei di più: farei in modo che i mesi possano "auto-ordinarsi", facendo implementare Comparable.
    A parte il fatto che l'avevo già proposto nel mio successivo post.

    codice:
       
    public int compareTo(Mese obj) {      
     return mesi.get(nome.toUpperCase()) - mesi.get(obj.nome.toUpperCase());    
    }
    All'utente Mitele serve ordinarli in modo decrescente, quindi non secondo l'usuale ordine cronologico.

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da VincenzoTheBest
    A parte il fatto che l'avevo già proposto nel mio successivo post.
    Mi era sfuggito.

    codice:
       
    public int compareTo(Mese obj) {      
     return mesi.get(nome.toUpperCase()) - mesi.get(obj.nome.toUpperCase());    
    }
    All'utente Mitele serve ordinarli in modo decrescente, quindi non secondo l'usuale ordine cronologico.
    E pure questo. Sì, per l'ordine inverso è sufficiente invertire minuendo e sottraendo.


    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

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.