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

    ordinare una collection

    Forse faccio una domanda banale ma non ho trovato nulla di semplice nè qui nè in giro.
    Ho una collection di oggetti, questi oggetti hanno al loro interno un campo intero index (che fantasia eh ) per alcuni oggetti valorizzato, per altri no..
    L'ordinamento attuale della collection è per valore alfabetico di un altro campo.
    Come posso fare per ordinarlo in base ad index? E' possibile ordinare in modo che i primi n siano ordinati in base ad index e gli altri siano quelli con valore index nullo (e di qui, appunto, non mi interessa l'ordine)?
    E se sì come faccio?
    Ho provato a guardare il metodo Collections.sort ma vuole come parametro la collezione da ordinare.. come faccio a dirgli che l'ordinamento lo deve fare su quel preciso valore?
    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: ordinare una collection

    Originariamente inviato da yaya
    Ho provato a guardare il metodo Collections.sort ma vuole come parametro la collezione da ordinare.. come faccio a dirgli che l'ordinamento lo deve fare su quel preciso valore?
    Innanzitutto dovresti specificare che tipo di collection hai, perché i due metodi Collections.sort() operano solo esclusivamente su un List (è ovvio .. non avrebbe senso per un Set, Queue o altro).

    Poi comunque ti sono chiari i concetti alla base della comparazione? Hai presente Comparable e Comparator?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    120
    ho detto una stupidaggine dicendo che non si trovava nulla in rete: cercavo male!
    Comunque fino a 10 minuti fa non sapevo nulla di Comparable e Comparator, mi sono documentata per bene.
    La mia collection contiene delle mie classi ad-hoc che implementavano serializable, ho agito in questo modo:
    detto che la mia classe implementa Comparable
    aggiunto il metodo compareTo in cui spiego quale criterio utilizzare per ordinare un oggetto della mia classe

    Ora però, forse logicamente, non posso chiamare il Collections.sort proprio perchè ho una collection e non una list
    che confusione, pensavo fosse più semplice, lo ammetto..

    edit: un cast brutale a List è troppo.. brutto???

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da yaya
    Comunque fino a 10 minuti fa non sapevo nulla di Comparable e Comparator
    Ah beh....

    Originariamente inviato da yaya
    Ora però, forse logicamente, non posso chiamare il Collections.sort proprio perchè ho una collection e non una list
    Vuoi dirci quale è la tua collezione? Una map? un set?

    Originariamente inviato da yaya
    un cast brutale a List è troppo.. brutto???
    Sì e tra l'altro non funzionerebbe nemmeno (ti beccheresti ClassCastException).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    120
    Originariamente inviato da andbin

    Vuoi dirci quale è la tua collezione? Una map? un set?
    ooopps chiedo venia, me ne son scordata!
    è una LinkedHashMap

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da yaya
    è una LinkedHashMap
    Ok, comunque all'inizio hai detto "L'ordinamento attuale della collection è per valore alfabetico di un altro campo.".
    Se ti riferisci a questo LinkedHashMap, non ha senso e non è vero. Un LinkedHashMap è una collezione di tipo "ordered" (ma non è "sorted"). Ordered vuol dire che l'ordine di iterazione non è casuale ma segue un ordine specifico (che però non dipende dal contenuto degli oggetti).

    In un LinkedHashMap la iterazione può essere per ordine di "inserzione" o per ordine di "ultimo accesso" (quale dei due, dipende dal costruttore usato per creare il LinkedHashMap).

    Quindi torniamo al punto di partenza: in un LinkedHashMap non c'è alcun modo di stabilire un qualche ordine né su chiavi né (tantomeno) sui valori basandosi sul contenuto degli oggetti.

    Per concludere: che cosa devi/vuoi fare di preciso e perché? Ad esempio: puoi spiegare se c'è un motivo preciso per cui hai scelto LinkedHashMap?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    120
    Purtroppo il problema fondamentale è che mi tocca apportare delle modifiche ad un vecchio programma scritto da altri (con zero commenti ) cercando di andare ad alterare il meno possibile la struttura originale.
    Per questo non so perchè all'epoca fu scelto di implementare la collection con quel tipo di mappa.
    Il fatto che siano ordinati in ordine alfabetico su un codice interno non deriva da un ordinamento a posteriori ma perchè sono dati che vengono estratti da un gestionale e il loro ordinamento originale è appunto quello alfabetico.
    Non posso nemmeno riordinarli al momento dell'inserimento nella collection perchè i dati che mi consentono l'ordinamento che serve a me li ottengo solo in seguito.
    Cerco di spiegarmi meglio perchè non so se sono stata chiara

    La mia collection iniziale è fatta in questo modo (circa)

    - record1:
    cod: A
    - record2:
    cod: B
    - record3:
    cod: C
    - record4:
    cod: D

    nel momento della visualizzazione in output io devo vedere quali di questi record fa match con i codici di un arraylist (che contiene solo un sottinsieme dei codici totali che sono nella collection) e riordinare la collection in base all'ordinamento che ho nell'arraylist, per esempio se il mio arraylist è questo:

    -record1:
    cod_array: D
    -record2:
    cod_array: B

    devo estrarrei i dati dalla collection estraendo prima il record4, poi il record2 poi l'1 e il 3 (o il 3 e l'1, non mi interessa)
    Ora per l'ordinamento io ho aggiunto agli oggetti della collection un campo intero, scorrendo le due liste assegno un indice agli oggetti della collection che diventa fatta così:

    - record1:
    cod: A
    index=null
    - record2:
    cod: B
    index=2
    - record3:
    cod: C
    index=null
    - record4:
    cod: D
    index=1

    Ora quello che non riesco a risolvere è il riordinamento della collection in modo che scorrendola mi escano prima i record 4 e 2 e poi gli altri
    spero di essere stata un pò più chiara, mi rendo conto che dovendo scriverlo su un forum risulta mi complesso da spiegare di quanto non sia in realtà (e magari anche la soluzione è banale e sono io che non la vedo )

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da yaya
    Purtroppo il problema fondamentale è che mi tocca apportare delle modifiche ad un vecchio programma scritto da altri (con zero commenti ) cercando di andare ad alterare il meno possibile la struttura originale.
    Capisco e concordo .... lo so anch'io che può non essere facile....


    Originariamente inviato da yaya
    Il fatto che siano ordinati in ordine alfabetico su un codice interno non deriva da un ordinamento a posteriori ma perchè sono dati che vengono estratti da un gestionale e il loro ordinamento originale è appunto quello alfabetico.
    Ah, ok allora è un caso particolare. Il LinkedHashMap è sicuramente creato per "insertion order", quindi se i dati inseriti sono già ordinati in modo alfabetico (le chiavi chiaramente, non i valori) allora guarda caso la collezione mantiene perlomeno quell'ordine di inserimento.

    Originariamente inviato da yaya
    Non posso nemmeno riordinarli al momento dell'inserimento nella collection perchè i dati che mi consentono l'ordinamento che serve a me li ottengo solo in seguito.
    Cerco di spiegarmi meglio perchè non so se sono stata chiara

    La mia collection iniziale è fatta in questo modo (circa)

    - record1:
    cod: A
    - record2:
    cod: B
    - record3:
    cod: C
    - record4:
    cod: D

    nel momento della visualizzazione in output io devo vedere quali di questi record fa match con i codici di un arraylist (che contiene solo un sottinsieme dei codici totali che sono nella collection) e riordinare la collection in base all'ordinamento che ho nell'arraylist, per esempio se il mio arraylist è questo:

    -record1:
    cod_array: D
    -record2:
    cod_array: B

    devo estrarrei i dati dalla collection estraendo prima il record4, poi il record2 poi l'1 e il 3 (o il 3 e l'1, non mi interessa)
    Innanzitutto assumo che i vari cod A, cod B siano le chiavi nella LinkedHashMap (altrimenti è più tosto).

    Puoi fare una cosa abbastanza semplice (è la prima che mi viene in mente e potrebbero essercene di migliori....): crei una terza collezione che sia almeno di tipo "ordered" (cioè esista un ordine di iterazione, che è quello che ti serve, credo) come un LinkedHashMap o un LinkedList o un ArrayList).

    Fai una iterazione sull'ArrayList (quello che contiene il sottoinsieme), per ogni elemento vai a cercarlo nel primo LinkedHashMap (questa operazione è molto veloce ... è un map dopotutto). Se c'è nel map, lo inserisci nella nuova collezione e lo togli dal map.
    Vai avanti così e alla fine inserisci nella nuova collezione gli elementi della map che non sono stati trovati (quelli per cui l'ordine hai detto che non è importante).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    120
    grazie mille andbin, ho seguito il tuo consiglio e funziona alla perfezione.. certe volte ci si fissa sulle cose e le soluzioni più semplici non vengono in mente! grazie ancora

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.