Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    883

    come ordinare un arraylist

    Devo ordinare un ArrayList fatta da Stringhe che contengono valori come, ad esempio, questi:

    233f
    233a
    1210
    1408
    233
    233b
    1513
    572k
    572g
    572
    1839
    1838

    vorrei che dopo l'ordinamento la lista fosse questa:

    1839
    1838
    1513
    1408
    1210
    572k
    572g
    572
    233f
    233b
    233a
    233

    Ho provato questo codice:

    Collections.sort(visuraList, new ComparatorForCodice());

    dove la classe comparetor è questa:

    codice:
    public class ComparatorForCodice implements Comparator {
    
    	public int compare(Object arg0, Object arg1) {
    		int codice0 = 0;
    		String codice0_ = ((RichiestaVisuraBean) arg0).getCodice();
    		try {
    			codice0 = Integer
    					.parseInt(((RichiestaVisuraBean) arg0).getCodice());
    		} catch (Exception e) {
    			System.out
    					.println("codice0 non numerico: " + e.getMessage());
    			//se trovo una lettera nel codice la eliminio dalla comparazione
    			codice0 = Integer
    					.parseInt(codice0_.substring(0, codice0_.length()-1));
    		}
    
    		int codice1 = 1;
    		String codice1_ = ((MyBean) arg1).getCodice();
    		try {
    			codice1 = Integer
    					.parseInt(((MyBean) arg1).getCodice());
    		} catch (Exception e) {
    			System.out
    					.println("codice1 non numerico: " + e.getMessage());
    		//se trovo una lettera nel codice la eliminio dalla comparazione
    			codice1 = Integer
    					.parseInt(codice1_.substring(0, codice1_.length()-1));
    		}
    
    		return (codice0 > codice1) ? 1 : 0;
    	}
    
    }
    ma la lista non risulta ordinata come voglio io, come posso fare?

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

    Re: come ordinare un arraylist

    Originariamente inviato da abcd1000
    vorrei che dopo l'ordinamento la lista fosse questa:

    1839
    1838
    1513
    1408
    1210
    572k
    572g
    572
    233f
    233b
    233a
    233
    Ma non hai spiegato "a parole" la regola generale dell'ordinamento!! Che sarebbe stato molto più importante e utile ai fini di una risposta!

    Dalla lista che hai postato potrei dedurre la seguente logica: la prima parte è un numero che va estratto trascurando eventuali lettere seguenti. L'ordinamento principale è quello di questi numeri in senso decrescente. Vedo che in alcuni casi c'è una lettera dietro. Ne esiste solo 1 al massimo di lettera? Deve entrare nella logica dell'ordinamento? Perché dalla lista, guarda caso, a parità di numero le lettere sembrano essere in senso decrescente anche loro .....

    Originariamente inviato da abcd1000
    Ho provato questo codice:
    No alt. Qui ci sarebbero da chiarire alcune cose. Hai parlato di ArrayList fatto di stringhe .... io mi aspetterei quindi un ArrayList che contiene direttamente oggetti String.

    Dal tuo codice si potrebbe capire tutt'altro ..... cosa sono quei RichiestaVisuraBean e MyBean?? Perché di arg0 fai il cast a RichiestaVisuraBean e di arg1 a MyBean???
    Gli oggetti contenuti nella lista dovrebbero essere tutti dello stesso tipo. Non devi presupporre che dei due argomenti di compare() uno sia di tipo X e l'altro di tipo Y.

    L'unica cosa certa è che l'algoritmo di ordinamento in Collections.sort() farà tutta una serie di comparazioni, passando di volta in volta al compare() 2 oggetti della lista. Ma tu non sai a priori quale è la sequenza delle comparazioni e quali oggetti della lista saranno passati ad ogni invocazione.

    Quindi invece di partire "in quarta", inizia a spiegare bene e meglio cosa hai nel ArrayList e la logica generale dell'ordinamento.
    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
    Oct 2002
    Messaggi
    883
    L'arraylist è composta da oggetti di tipo RichiestaVisuraBean (MyBean è un errore di trascrizione, al posto di mMyBean c'è RichiestaVisuraBean) dentro questo oggetto c'è il codice di tipo string
    Gli oggetti vanno ordinati per codice. Il codice è un numero, in alcuni casi è un numero con una lettera finale.

    L'ordinamento per codice deve essere decrescente, dal numero più grande al più piccolo, nel caso in cui ci sia una lettera nel codicel caso va ordinato dalla lettera Z alla lettera A, la sequenza che ho scritto rappresenta l'ordinamento che devo ottenere

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da abcd1000
    L'arraylist è composta da oggetti di tipo RichiestaVisuraBean (MyBean è un errore di trascrizione, al posto di mMyBean c'è RichiestaVisuraBean) dentro questo oggetto c'è il codice di tipo string
    Ok, ora la cosa è chiara.

    Originariamente inviato da abcd1000
    L'ordinamento per codice deve essere decrescente, dal numero più grande al più piccolo, nel caso in cui ci sia una lettera nel codicel caso va ordinato dalla lettera Z alla lettera A, la sequenza che ho scritto rappresenta l'ordinamento che devo ottenere
    Perfetto, ora anche questo è chiaro.

    A questo punto però non devi cercare di fare subito un parseInt() di tutto il codice .... perché se c'è una lettera, fallisce.

    Devi trovare il modo di estrarre il solo numero dalla stringa e la lettera. Si può fare in diversi modi: un semplice ciclo for in cui scansioni carattere per carattere finchè non trovi una lettera. Oppure usando le "espressioni regolari".
    Alla fin fine per ogni codice dovrai ottenere: a) un String con le sole cifre e b) un String con la lettera (eventualmente stringa vuota "" se non c'è la lettera).

    La stringa con il numero la passi a parseInt() per ottenere un int. A quel punto fai i confronti. Prima i due int, se uno è maggiore/minore dell'altro hai già il risultato complessivo (e non devi confrontare la lettera). Se i due int sono uguali allora devi confrontare le stringhe con le lettere. Una stringa vuota viene prima di una stringa con es. "a". Quindi girando il senso ottieni proprio l'ordinamento che hai indicato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.