» »

[Java] Sortiranje razredov

[Java] Sortiranje razredov

piki12 ::

Lep pozdrav vsem forumašom,
zanima me kako se sortira razrede če imam nekako takole zgrajeno:

abstract class vozilo{
  private String ime;
}
class avto extends vozilo{

}
class avtobus extends vozilo{

}
class ladja extends vozilo{

}
V mainu bi pa rad sortiral po imenu listvozil je po specifikaciji ArrayList<vozilo>
    Collections.sort(listvozil, new Comparator() {      
             public int compare(vozilo o1,vozilo o2) {  
              return o1.getImeDatoteke().compareTo(o2.getImeDatoteke());
                 }

// javi pravi da tole ni pravilno vendar ne vem zakaj če dodam pri abstraktnem razredu abstract class vozilo implements Comparable<vozilo>


            });



Mog

zenb ::

Nisem domač v Javi, ampak ali imaš implementiran Comparator ali samo kreiral novo instanco vmesnika? V C# dodaš nov razred, ki podeduje IComparable v katerem napišeš metodo za primerjav, ki vrača integer in potem v Collections.sort uporabiš new MojComparator.
Mislim pa, da ti samo manjka @Override v 15. vrstici.

piki12 ::

<anonymous MediaOrganizer$1> is not abstract and does not override abstract method compare(Object,Object) in Comparator
----
(Alt-Enter shows hints)

eno vrstico višje piše :/ ne vem kaj bi bilo

genesiss ::

Saj ti piše?
"does not override abstract method compare(Object, Object)"

piki12 ::

ja če dam object mi pa ne zazna metodi getImeDatoteke(), hmm mogoče kaka ideja :D

ycw_ ::

Napako ti javi, ker hočeš primerjat po metodi (getImeDatoteke), ki ne obstaja v objektu.

v vozilo dodaj metodo:

public String getIme() {
return ime;
}

In nato pri sortu uporabi:

return o1.getIme().compareTo(o2.getIme());

kr?en ::

package random.stuff;

public abstract class Vozilo
{
    private String ime;

    public String getIme()
    {
        return ime;
    }

    public void setIme(String ime)
    {
        this.ime = ime;
    }

}

package random.stuff;

public class Avto extends Vozilo
{
    public Avto(String ime)
    {
        setIme(ime);
    }

    @Override
    public String toString()
    {
        final StringBuilder sb = new StringBuilder("Avto{");
        sb.append("ime='").append(getIme()).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

//na isti nacin sta potem se ostala dva Class-a

package random.stuff;

import java.util.Comparator;

public class VoziloComparator implements Comparator<Vozilo>
{

    @Override
    public int compare(Vozilo o1, Vozilo o2)
    {
        return o1.getIme().compareTo(o2.getIme());
    }
}

package random.stuff;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class RandomStuff
{
    public static void main(String[] args)
    {
        List<Vozilo> seznamVozil = new ArrayList<Vozilo>();

        seznamVozil.add(new Avtobus("MAN"));
        seznamVozil.add(new Ladja("Titanic"));
        seznamVozil.add(new Avto("Audi"));
        seznamVozil.add(new Avto("BMW"));
        seznamVozil.add(new Avto("Mercedes"));

        System.out.println(seznamVozil.toString());

        Collections.sort(seznamVozil, new VoziloComparator());

        System.out.println(seznamVozil.toString());
    }
}

//izpis
[Avtobus{ime='MAN'}, Ladja{ime='Titanic'}, Avto{ime='Audi'}, Avto{ime='BMW'}, Avto{ime='Mercedes'}]
[Avto{ime='Audi'}, Avto{ime='BMW'}, Avtobus{ime='MAN'}, Avto{ime='Mercedes'}, Ladja{ime='Titanic'}]


Pa tole bi jaz raje delal z tako, da je Vozilo interface in ne abstraktni razred.

Zgodovina sprememb…

  • spremenil: kr?en ()

piki12 ::

Aha dobro pač vajo delam :P taka so navodila bila :)
Emm zanima me kako bi pa recimo da ima ladja velikost sidra atribut, in bi po tem hotel sortirat, ostali objekti ki niso ladja pa imajo velikost sidra 0, kako bi pa tole presortiral.
Drugače pa hvala to ful dobr dela zdej :P

Zgodovina sprememb…

  • spremenilo: piki12 ()

kr?en ::

Preveris, ce je objekt tipa Ladja
if (object instanceof Ladja)

in potem castas objekt v Ladja
Ladja ladja = (Ladja) object;

ter primerjas po velikosti sidra
ladja1.getVelikostSidra() > ladja1.getVelikostSidra()


Ampak potem imas se razne ostale pogoje, kaj storiti v primeru, ce primerjas Ladja in Avto itd.

piki12 ::

Najlepša hvala :)

Spura ::

piki12 je izjavil:

 is not abstract and does not override abstract method compare(Object,Object) in Comparator
----
(Alt-Enter shows hints)

eno vrstico višje piše :/ ne vem kaj bi bilo

Ti si deklariral svoj komparator kot raw type, kar pomeni da mora imeti funkcijo compare(Object, Object). Ti si pa naredil funkcijo compare(vozilo, vozilo).


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

c# seminarska

Oddelek: Programiranje
112645 (2318) tuned
»

[Java] Podatkovni tip

Oddelek: Programiranje
233791 (3443) piki12
»

Sortiranje po večih atributih, java

Oddelek: Programiranje
161674 (1440) marjan_h
»

[C#] Delo z okni - urejanje osebe

Oddelek: Programiranje
8984 (856) darkolord
»

[Java] Sortiranje objektov

Oddelek: Programiranje
192845 (2845) tjaz24

Več podobnih tem