TreeSet - błąd podczas kompilacji

0

Witam!
Próbuję zrobić TreeSet, ale już na samym początku jest błąd w kodzie. Problem zaczął się po utworzeniu metody dodaj() w klasie Firma.
Zdaję sobie sprawę, że powinno się ustawić niektóre zmienne jako prywatne i używać getterów, ale świadomie tego nie robiłem. Jeżeli jest coś w tym kodzie "niezgodnego z paradygmatami programowania"(poza tym, o którym wspomniałem wcześniej) albo po prostu da się lepiej to mile widziane są wszystkie uwagi.(w pewnych granicach, ponieważ jestem dopiero początkującym i pewnie nie zrozumiem zbyt zaawansowanych "ulepszeń")

import java.util.*;
class Pracownik
{
    String nazwisko;
    double etat;
    Pracownik(String nazwisko, double etat)
    {
        this.nazwisko=nazwisko;
        this.etat=etat;
    }
    public String toString()
    {
        return ("Nazwisko: "+nazwisko+" Etat: "+etat);
    }
}
class Urzednik extends Pracownik
{
    double podstawowa, premia;
    Urzednik(String nazwisko, double etat, double podstawowa,double premia)
    {
        super(nazwisko,etat);
        this.premia=premia;
        this.podstawowa=podstawowa;
    }

    public double wyplata()
    {
        return(podstawowa*etat+podstawowa*etat*premia);
    }

    public String toString()
    {
        String baza=super.toString();
        return(baza+"wyplata: "+wyplata());
    }
}
class Robotnik extends Pracownik
{
    double liczbaGodzin,stawkaGodzinowa;
    int LIMIT=100;

    Robotnik(String nazwisko, double etat,
             double liczbaGodzin, double stawkaGodzinowa)
    {
        super(nazwisko,etat);
        this.liczbaGodzin=liczbaGodzin;
        this.stawkaGodzinowa=stawkaGodzinowa;
    }

    public double wyplata()
    {
        double wyp;
        if(liczbaGodzin>LIMIT)
            wyp=liczbaGodzin*stawkaGodzinowa+
                    (liczbaGodzin-LIMIT)*1.5*stawkaGodzinowa;
        else
            wyp=liczbaGodzin*stawkaGodzinowa;
        return wyp;
    }

    public String toString()
    {
        String baza=super.toString();
        return(baza+"wyplata: "+wyplata());
    }
}

class Firma  {
    TreeSet<Pracownik> ts = new TreeSet<Pracownik>();


    public void dodaj(Pracownik prac) {
        ts.add(prac);
        System.out.println("Dodano");
    }

}

public class Main
{
    public static void main(String args[])
    {
        Firma fi = new Firma();
        Robotnik r0 = new Robotnik("Marchewka",1.0,99,10.0);
        Robotnik r1 = new Robotnik("Kasztan",1.5,115,9.0);
        Robotnik r2 = new Robotnik("Ziemniak",1.0,101,11.0);
        Urzednik u0 = new Urzednik("Jablko",0.5,1000,0.15);
        Urzednik u1 = new Urzednik("Truskawka",1.5,4000,0.25);
        Urzednik u2 = new Urzednik("Sliwka",1,2000,0.55);

        fi.dodaj(r0);
        fi.dodaj(r1);
        fi.dodaj(r2);
    }
}

edit: Błąd z konsoli:

Exception in thread "main" java.lang.ClassCastException: Robotnik cannot be cast to java.lang.Comparable
	at java.util.TreeMap.compare(TreeMap.java:1294)
	at java.util.TreeMap.put(TreeMap.java:538)
	at java.util.TreeSet.add(TreeSet.java:255)
	at Firma.dodaj(Main.java:73)
	at Main.main(Main.java:91)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
1

Wow! to tak można w Javie? Czego to się człowiek nie nauczy :P

         return(podstawowa*etat+podstawowa*etat*premia);
  1. Błąd też taguj jak kod.
  2. Wystarczy, że znasz angielki i masz rozwiązanie.

Zanim dam Ci rozwiązanie, to odpowiedz:

  1. Dlaczego chcesz użyć akurat TreeSet?

@Shalom Zabrałeś mu okazję do samodzielnej analizy porównawczej implementacji Set. :(

1

TreeSet trzyma elementy w drzwie binarnym a to z definicji wymaga możliwosci porównywania ze sobą elementów które do drzewa wkładasz. Tych twoich klas nie da się porównać bo nie zaimplementowałeś takiej możliwości i stąd nie będzie to działać. Albo te klasy muszą być Comparable albo użyj innego seta, np. HashSet.

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