Salve, ho una matrice con nxm e vorrei ordinarla in base alle colonne (m), naturalmente una colonna per volta, come posso fare?
Salve, ho una matrice con nxm e vorrei ordinarla in base alle colonne (m), naturalmente una colonna per volta, come posso fare?
Innanzitutto dovresti precisare dati di che tipo.Originariamente inviato da Reddragoon
Salve, ho una matrice con nxm e vorrei ordinarla in base alle colonne (m), naturalmente una colonna per volta, come posso fare?
Poi comunque visto che parli di ordinare "una colonna", allora è evidente che l'insieme dei dati che costituiscono una "colonna" non rappresenta un array "lineare". Pertanto è una cosa particolare e nel framework standard di Java non c'è nulla per fare cose del genere.
Quindi devi implementare tu un algoritmo di ordinamento, uno tra quelli "noti", es. bubblesort, quicksort ecc...
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Mi spiego meglio, la matrice contiene valori double, siccome devo prendere i primi valori di ogni colonna in ordine crescente, mi servirebbe fare appunto questo tipo di ordinamento.
Mi è venuto il dubbio adesso. Intendi "ordinare i dati in una colonna" o "ordinare le righe della matrice in base ai valori di una colonna"??
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
ehm....è un pò complicato, cerco di essere chiaro con un esempio.
0.2356 0.7895
0.0112 0.8796
0.0100 0.4785
.... ....
Quello che voglio è poter ordinare la prima colonna come nell'esempio(poi la seconda, la terza, ecc...), leggere i valori che mi interessano in ordine crescente; naturalmente le righe devono spostarsi quando fa l'ordinamento della colonna in questione. Spero di essermi spiegato bene, è un mezzo c... sta cosa.
Allora è il secondo caso che ho citato appena prima.Originariamente inviato da Reddragoon
ehm....è un pò complicato, cerco di essere chiaro con un esempio.
0.2356 0.7895
0.0112 0.8796
0.0100 0.4785
.... ....
Quello che voglio è poter ordinare la prima colonna come nell'esempio(poi la seconda, la terza, ecc...), leggere i valori che mi interessano in ordine crescente; naturalmente le righe devono spostarsi quando fa l'ordinamento della colonna in questione. Spero di essermi spiegato bene, è un mezzo c... sta cosa.
Devi ordinare le righe in base ai valori di una/più colonne.
La questione a questo punto diventa però più semplice, perché non devi implementare tu l'algoritmo di ordinamento!!
In Java gli array multidimensione sono semplicemente "array di array". Cioè un array che contiene riferimenti ad altri array, ecc...
Pertanto per la tua matrice c'è un array principale che contiene riferimenti agli array delle righe (che contengono N valori per le colonne). E ogni riga la devi vedere come "un record".
Se la tua matrice è double[][], vuol dire che l'array principale contiene N riferimenti ad array double[]. Quindi tu devi ordinare l'array principale e gli elementi da trattare sono dei double[].
Concettualmente non ci sarebbe differenza nell'ordinare un array di oggetti XYZ basandosi su una o più "proprietà" dell'oggetto (es. oggetti Persona e ordinarli per cognome poi nome).
Ti basta pertanto implementare la interfaccia Comparator in modo che il compare() sappia di riceve 2 double[] di cui poi tu vai a comparare una o più colonne in "cascata".
Non mi dilungo troppo, vedi questa discussione in cui facevo un esempio.
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
ok, solo una cosa non mi è chiara, come faccio a stabilire che mi debba ordinare i valori della prima colonna e solo dopo averli letti quelli della seconda????p.s. per i valori double rispetto all'esempio che mi hai linkato devo cambiare qualcosa nell'if?
Grazie
Qui bisogna solo capire meglio (io l'ho ipotizzato ma non sono ancora sicuro che sia questo che volevi) se queste colonne le devi comparare in "cascata".Originariamente inviato da Reddragoon
come faccio a stabilire che mi debba ordinare i valori della prima colonna e solo dopo averli letti quelli della seconda????
Per farti di nuovo lo stesso paragone fatto prima, se tu avessi 2 oggetti Persona potresti decidere di ordinare per cognome/nome, vuol dire cioè che prima confronti i 2 cognomi e solo se questi sono uguali allora vai a confrontare i nomi.
I valori double li puoi comunque confrontare con i soliti operatori <, >, <=, >=.Originariamente inviato da Reddragoon
per i valori double rispetto all'esempio che mi hai linkato devo cambiare qualcosa nell'if?
Ma nota che la classe Double ha già un compare() che riceve 2 double e restituisce il risultato della comparazione. Che in questo caso può essere molto utile (purtroppo non c'è l'equivalente per int in Integer .... ecco perché in quel post avevo usato < > ).
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
Ok, mi è chiaro, ho visto ora il metodo compare.
Per quanto riguarda i controllli, io voglio ordinare solo la prima colonna, fare le mie operazioni e poi ordinare solo la secondo colonna, ecc...
Potresti fare un unico comparatore che può essere parametrato (tramite costruttore) circa la colonna da ordinare.Originariamente inviato da Reddragoon
Per quanto riguarda i controllli, io voglio ordinare solo la prima colonna, fare le mie operazioni e poi ordinare solo la secondo colonna, ecc...
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet