Ordinamento arrayList

di il
2 risposte

Ordinamento arrayList

Ciao a tutti,
Io ho un dubbio sull'ordinamento degli arrayList: ho un arrayList di oggetti Event (arrayList<Event> eventi), questi oggetti hanno una data, e la classe l'ho scritta io (non ho usato Date di Java perchè è deprecated e mi dava problemi), ho anche scritto un metodo apposito che mi ritorna determinati valori se una data è maggiore, minore o uguale rispetto ad un'altra in modo da poter comparare due oggetti Event. Cercando su internet ho visto che si può usare Collections, ma non saprei se sarebbe possibile in qualche modo utilizzarlo/amalgamarlo con quello che vorrei fare io.

La mia classe data:
public class DateJ implements Serializable {
	
	private static final long serialVersionUID = 3888044234499074976L;
	private int day;
	private int month;
	private int year;
	private int hours = 1;
	
	
	public DateJ(int day, int month, int year) {
		this.day = day;
		this.month = month;
		this.year = year;
	}
	
	public DateJ() {
		
	}
	
	public int getHours() {
		return this.hours;
	}
	
	public void setDay(int day) {
		this.day = day;
	}
	
	public void setHours(int hours) {
		this.hours = hours;
	}
	
	public void setMonth(int month) {
		this.month = month;
	}
	
	public void setYear(int year) {
		this.year = year;
	}
	
	public int getDay() {
		return this.day;
	}
	
	public int getMonth() {
		return this.month;
	}
	
	public int getYear() {
		return this.year;
	}
}
il metodo che compara due date:
public int compare(DateJ date1, DateJ date2) {
		if(date1.getYear() > date2.getYear()) {
			return 1;
		}
		else if(date1.getYear() < date2.getYear()) {
			return -1;
		}
		else if(date1.getYear() == date2.getYear()) {
			if(date1.getMonth() > date2.getMonth()) {
				return 1;
			}
			else if(date1.getMonth() < date2.getMonth()) {
				return -1;
			}
			else if(date1.getMonth() == date2.getMonth()) {
				if(date1.getDay() > date2.getDay()) {
					return 1;
				}
				else if(date1.getDay() < date2.getDay()) {
					return -1;
				}
				else if(date1.getDay() == date2.getDay()) {
					return 0;
				}
			}
		}
		return -2;
	}

2 Risposte

  • Re: Ordinamento arrayList

    DadaLilli ha scritto:


    non ho usato Date di Java perchè è deprecated e mi dava problemi
    java.util.Date di per sé NON è deprecata. Sono deprecati diversi suoi costruttori/metodi. Ma esclusi questi, per il resto è (tuttora) perfettamente usabile.

    Se usi Java 8+, meglio un Instant o magari un ZonedDateTime. Se non serve l'orario, va anche bene LocalDate. Dipende ....

    DadaLilli ha scritto:


    La mia classe data:
    Fare una classe per la data non è sbagliato in senso generale. Ma richiede molta attenzione. Possibilmente farla in modo che sia "immutabile" (la tua è mutabile). E possibilmente con dei check per verificare che non venga usata "male" (es. day negativo).

    DadaLilli ha scritto:


    il metodo che compara due date:
    public int compare(DateJ date1, DateJ date2) {
    Questo lo hai scritto DOVE? Spero NON in DateJ. Comunque è "troppo" lungo, si può accorciare in vari modi.
    Se vuoi rendere "comparabile" la tua DateJ, dovresti fargli implementare la interfaccia Comparable.

    Ho scritto un bell'articolo qui su iprogrammatori sull'argomento: https://www.iprogrammatori.it/articoli/java/art_comparazione-e-ordinamento-degli-oggetti-in-java_1659.aspx
  • Re: Ordinamento arrayList

    Alcune considerazioni:
    1) La classe java.util.Date non è mai stata deprecata. Lo sono la maggior parte dei suoi metodi e costruttori, ma la classe in sé è ancora lì (anche nel JDK 14) ed è, ovviamente, utilizzabile.

    2) Esiste, comunque, la DateTime API

    Andiamo oltre le considerazioni e guardiamo al tuo codice:
    1) Se A non è maggiore di B e non è neppure minore di B allora, obbligatoriamente, è uguale a B. Quindi, su ogni confronto che hai fatto, è perfettamente inutile mettere
    
    if (date1.getYear() == date2.getYear())
    
    (e lo stesso per i mesi e per i giorni) semplicemente perchè gli altri casi li hai già esclusi prima.

    2) Per poter utilizzare i sort di Collections la classe deve essere Comparable. E per una classe come la tua è naturale che sia così. Quindi: fai implementare Comparable<DateJ> nella classe DateJ e implementa il metodo
    
    public int compareTo(DateJ d) {
       ...
    }
    
    In questo modo puoi usare Collections.sort() senza dover costruire un Comparator.

    PS: vedi tu se dovesse servire qualche controllo di coerenza (tipo giorni / mesi / anni non negativi, date impossibili come il 30 febbraio, ecc).
Devi accedere o registrarti per scrivere nel forum
2 risposte