własny komparator do TreeSet

0

Moja klasa implementuje datę. Musze zapakować do kolekcji utworzone obiekty Data2. W przykładzie zapakowałem je do kolekcji LinkedList i jest OK.
Ale chciałbym je zapakować do TreeSet. I tu jest problem...w czasie działania programu sypie wyjątkami. Sądzę że chodzi o to że TreeSet jest strukturą uporządkowaną a on nie wie jak porównać te obiekty Data2.
Domyślam się że trzeba napisać swój komparator.
I tu mam problem....jak on powinien się nazywać? czy potrzebne są jeszcze jakieś metody żeby można było zapakować to do TreeSet? czy potrzebne jest equals....?

Tak sobie myślę że chyba bym potrafił napisać taki komparator modyfikując nieco moją metodę public void porownaj_daty(Data2 termin);
ale jak ona się ma nazywać? compare? compareTo? i czy ona wystarczy?

Bardzo. bardzo proszę o pomoc.

/**
 * Klasa <b>Data2</b> implementuje datę.
 * @version 0.9
 * @author Kamil Kuchta
 */

import java.lang.String;
import java.util.*;

public class Data2{
	private int rok = 1;
	private int miesiac = 1;
	private int dzien = 1;

	static int dni_miesiaca[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

/**
 * Konstruktor trój-parametrowy
 * @param r rok
 * @param m miesiac
 * @param d dzien
 */
public Data2(int r, int m, int d){
	rok = r;
	miesiac = m;
	dzien = d;
}

/**
 * Metoda wypisująca nazwę danego miesiąca
 */
 
public String nazwa_miesiaca(){
	String nazwy_mies[] = {"Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"};
	 return nazwy_mies[miesiac-1];
}

/**
 * Metoda zwracająca tekstową reprezentację daty
 */
 
public String pokaz(Data2 term){
	String wynik = term.rok + " " + term.miesiac + " " + term.dzien;
	return wynik;

}

/**
 * Metoda porównująca dwie daty
 * @param termin
 */
 
public void porownaj_daty(Data2 termin){

	if (rok > termin.rok) {
		System.out.println(pokaz(termin) + " jest wcześniej niż " + pokaz(this));
	} else if (rok < termin.rok) {
		System.out.println(pokaz(termin) + " jest później niż " + pokaz(this));

	} else if (miesiac > termin.miesiac) {
		System.out.println(pokaz(termin) + " jest wcześniej niż " + pokaz(this));
	} else if (rok < termin.miesiac) {
		System.out.println(pokaz(termin) + " jest później niż " + pokaz(this));

	} else if (dzien > termin.dzien) {
		System.out.println(pokaz(termin) + " jest wcześniej niż " + pokaz(this));
	} else if (dzien < termin.dzien) {
		System.out.println(pokaz(termin) + " jest później niż " + pokaz(this));
	} else System.out.println("Podane daty są jednakowe");
}

/**
 * Metoda sprawdzająca czy dany rok jest przestępny
 * @param termin
 * @return wartość logiczną - true jeśli rok jest przestępny
 */
 

static boolean czy_przestepny(Data2 termin){
	boolean wynik;
	if ((termin.rok % 4) == 0){
		wynik = true;
		//System.out.println("Rok jest przestepny");
	} else{
		wynik = false;
		//System.out.println("Rok nie jest przestepny");
	}
	return wynik;
}

/**
 * Metoda zwracająca tekstową reprezentację daty
 * @param termin po tym dniu zwracany jest następny dzien
 */

public Data2 nastepny_dzien(Data2 termin){
		if ( czy_przestepny(this) & miesiac==2 & dzien==28 ){
		termin.dzien = 29;
	} else if ( czy_przestepny(this) & miesiac==2 & dzien==29 ){
		termin.dzien = 1;
		miesiac = 3;
	} else if ( miesiac==12 & dzien==31 ){
		termin.rok++;
		termin.miesiac=1;
		termin.dzien=1;
	} else if ( ++dzien > dni_miesiaca[miesiac] ){
		termin.dzien=1;
		termin.miesiac++;
	}
return termin;
}

/**
 * Metoda sprawdzająca poprawność wpisanej daty
 */
 
public void poprawnosc(){
	if ((miesiac > 12) | (miesiac < 1)){
		System.out.println("Nie ma takiego miesiąca"); //hahaaa ale tu jest ArrayIndexOut
	}

	if ( ((czy_przestepny(this)) == true) & (miesiac == 2) & (dzien < 30)){
		// nie rób nic
	} else if (dni_miesiaca[miesiac-1] < dzien){
		System.out.println("Nieprawidlowa liczba dni w miesiacu");
	}		

}

public static void main (String[] args){
	LinkedList<Data2> zbior = new LinkedList<Data2>();
	int ile = 10;
	Random los = new Random();
	
	for (int i=0; i<ile; i++){
	zbior.add( new Data2((int)los.nextInt(30), (int)los.nextInt(12),  (int)los.nextInt(2006)));
	}
	
	Iterator it = zbior.iterator();
	while (it.hasNext()){
	Data2 temp = (Data2) it.next();
	System.out.println(temp.pokaz(temp));
	}

}
}
0

Prawdopodobnie musisz zaimplementowac interfejs Comparable, do tego z tego co pisze dokumentacja dobrze bedzie jak implementacja tego interfejsu bedzie zgodna z implementacja metody equals.

0

Dokładnie...tylko mam kłopoty z połapaniem się z tym wszystkim...napisałem taki komparator. Wiem że ma właśnie zwracać -1 i 1 w różnych przypadkach...tylko co dalej, gdzie go wkleić...? Czy potrzeba coś jeszcze pisać .... jakieś implements Comparable czy coś innego?

Proszę... bardzo mi na tym zależy.

public int compareTo(Data2 termin){

        if (rok > termin.rok) {
             return 1;
        } else if (rok < termin.rok) {
             return -1; 
        } else if (miesiac > termin.miesiac) {
                return 1;
        } else if (rok < termin.miesiac) {
                return -1;

        } else if (dzien > termin.dzien) {
                return 1;
        } else if (dzien < termin.dzien) {
                return -1;
        } else return 0;
}
0

Tak, implements Comparable - element wstawiany do TreeSet musi ten interfejs implementowac. Pamietaj tez o przeladowaniu metody equals - zeby zwracala true tam gdzie compareTo zwraca 0.

1 użytkowników online, w tym zalogowanych: 0, gości: 1