» »

[Java] Sortiranje objektov

[Java] Sortiranje objektov

ta_pravi ::

Lep pozdrav

Mene pa zanima, kako bi v javi posortiral nek objekt po določenem atributu, ki bi si ga izbral?

-recimo, da imam knjižnico sortirnih metod
-imam objekte istega tipa vsak ima enako atributov, ki pa so različni
-v testnem programu pa bi si eno od teh izbral in posortiral objekte po izbranem atributu (npr. stevilo let)

???

LP
ta_pravi
  • spremenilo: snow ()

Bojevnik ::

Bubblesort je še kar učinkovik.
klik

Karlos ::

@Bojevnik

Bublesort niti ni učinkovit, je pa preprost za implementacijo.

http://www.cs.ubc.ca/~harrison/Java/sorting-demo.html
Sai Baba: "Dam vam to, kar hočete, da boste hoteli to, kar vam želim dati."

Bojevnik ::

Sorry, kot kaže sem si narobe zapomnu od osnov programirajna:8)

Zgodovina sprememb…

  • spremenilo: Bojevnik ()

ta_pravi ::

ja sej te sortirne metode poznam: mam pa za nardit v nekem razredu, iz katerega bom potem ekstendal objekte metodo compareTo(), ki jo implementira razred comparable. S to metodo naj bi potem s pomočjo razreda v katerem so sortirne metode , sortiral objekte po različnih atributih.(v testnem razredu).....pa mi ne gre v glavo kako naj bi to nardil nekako univerzalno, da bi compareTo() metoda delala potem na različnih atributih objekta....

ma kdo kako idejo??
ta_pravi

ta_pravi ::

...compareTo() pa bi klical v sortirni metodi....
ta_pravi

Vesoljc ::

po poljubnih paramaterih?

jah rabis se en parameter, ki ti doloca po katerem atributu ti primerja ala:

objekt a,b;
a.compareTo( b, SIZE );
a.compareTo( b, LENGTH );
etc..

kjer sta SIZE in LENGTH pac neka enumeratorja/flaga, ki dolocata tip sortiranja.

minus je to, da moras v sami compare funkciji narest dinamicen branch, ki naredi primerjavo na dolocenem tipu (lahko da tudi ne uspe, ce recimo a in b nimata istih atributov)
Abnormal behavior of abnormal brain makes me normal...

infiniteLoop ::

A to bi prav rad nekaj po svoje caral? Ali samo ne poznas standardne knjiznice? Za oboje, arraye in liste obstajajo sort metode, ki vzamejo Comparator kot parameter.Torej vse kar moras narediti je implementirati Comparatorje za polja po katerih hoces sortirati in jih "pofujtrati" sort metodam. That's it! Ce bi se pa rad sam matral s sort algoritmi (ker jih studiras ali karkoli ze) pa ti predlagam pa uberes isto strategijo, ker je standardna. Torej dodaj tudi sort metodo, ki sprejme Comparator.
None of us is as dumb as all of us.

ta_pravi ::

...torej compareTo() metodo, bi poklical v vsaki sortirni metodi(uporabil bom sortirne metode, ki so že napisane na netu). tako da moram predelat compareTo() metodo v razredu, kjer imam definiran objekt, ta razred pa implementira Comparable.

Moj problem je, da ne znam preuredit compare to metode, da bi ji lahko podal parametre , ki bi povedali po katerem atributu sortiram objekte...

??

LP
ta_pravi

infiniteLoop ::

Pa zakaj bi na vso silo rad uporabil neke nestandardne sortirne metode? A bi rad izumil kvadratno kolo? Evo podajam se en snelkurs primer:

Razred nad katerim se bomo izzivljali:
public class Oseba implements Comparable
{
    private String _ime;
    private int _starost;


    public Oseba(String ime, int starost)
    {
        setIme(ime);
        setStarost(starost);
    }

    public String getIme()
    {
        return _ime;
    }

    public void setIme(String ime)
    {
        _ime = ime;
    }

    public int getStarost()
    {
        return _starost;
    }

    public void setStarost(int starost)
    {
        _starost = (starost < 0) ? 0 : starost;
    }


    public int compareTo(Object o)
    {
        //po "defaultu" sortirajmo po imenu
        return getIme().compareTo(((Oseba)o).getIme());
    }


    public String toString()
    {
        return getIme() + " - " + getStarost();
    }
}



Izzivljanje:
import java.util.Arrays;
import java.util.Comparator;


public class Zagon
{
    public static void main(String[] args)
    {
        Oseba[] osebe = new Oseba[] {new Oseba ("Franc", 13), new Oseba("Andrej", 55), new Oseba("Simon", 23)};

        Arrays.sort(osebe); //uredi po defaultu - v nasem primeru po imenu;

        System.out.println("Po imenu: ");
        System.out.println(Arrays.toString(osebe));

        Comparator starostni = new Comparator() {
            public int compare(Object o1, Object o2)
            {
                return ((Oseba)o1).getStarost() - ((Oseba)o2).getStarost();
            }
        };

        Arrays.sort(osebe, starostni);

        System.out.println("Po starosti: ");
        System.out.println(Arrays.toString(osebe));

        Comparator imeNazaj = new Comparator() {
            public int compare(Object o1, Object o2)
            {
                return ((Oseba)o2).getIme().compareTo(((Oseba)o1).getIme());
            }
        };

        Arrays.sort(osebe, imeNazaj);

        System.out.println("Po imenu nazaj: ");
        System.out.println(Arrays.toString(osebe));
    }

}




Evo tolko za zdaj, ker je pozno.
None of us is as dumb as all of us.

ta_pravi ::

...fora je v tem, da mam za nardit nalogo v kateri je navodilo da naj naredim knjižnico sortirnih metod.
ta_pravi

ta_pravi ::

aja ...ta koscek meni v javi ne dela: return getIme().compareTo(((Oseba)o).getIme());
ta_pravi

ta_pravi ::

aja dela za string tip ja za int pa ne:)
ta_pravi

ta_pravi ::

public static void straightInsertion(NepOglas[] a, Comparator c) //navadno vstavljanje DELUJE
{
int i,j;
NepOglas x;
for (i=1; i manjse a.length; ++i)
{
x=a[i];
for (j=i-1; (j>=0 && (x.compareTo(a[j]) > 0)); --j) //tukaj se bo obračalo za smer sortiranja
a[j+1]=a[j];
a[j+1]=x;
//izpis tabele
}
}

EVO tako bi popravil mojo metodo za sortiranje! Da bi ji potem, ko bi jo poklical v testnem programu podal se parameter comparator, po katerem želim sortirat tabelo objektov.

.....nevem pa še kam naj vtaknem v tej metodi ta moj Comparator c:)

????

LP
ta_pravi

Gwanaroth ::

Ti to rešuješ za Osnove algoritmov in podatkovnih struktur 1 ?
Lights often keep secret hypnosis..

ta_pravi ::

jp
ta_pravi

infiniteLoop ::

Ne bom prevec pameten, ampak kaj ce bi uporabli comparator tam, kjer delas primerjavo (to compare - primerjati)

Torej namesto:
x.compareTo(a[j])

napisi:
c.compare(x, a[j])
None of us is as dumb as all of us.

ta_pravi ::

ej hvala za odgovore, mi je ratalo:)

LP
ta_pravi

infiniteLoop ::

np
None of us is as dumb as all of us.

tjaz24 ::

Lepo pozdravljeni mene pa zanima kje lahko dol potegnem DR Java 2.0 ki ga rabim na faksu za matematiko? Kakšen kj ve kje bi ga lahko najdu?

hvala


Vredno ogleda ...

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

[Java] Podatkovni tip

Oddelek: Programiranje
233508 (3160) piki12
»

[Java] Sortiranje razredov

Oddelek: Programiranje
101345 (1092) Spura
»

[Naloga][Java] Ulomki

Oddelek: Programiranje
62537 (2385) SkIDiver
»

[Java] Tezave s stringom

Oddelek: Programiranje
131566 (1505) Sergio
»

Java - sortiranje 2D tabele

Oddelek: Programiranje
61639 (1588) SkIDiver

Več podobnih tem