» »

Sortiranje po večih atributih, java

Sortiranje po večih atributih, java

marjan_h ::

Zadnje čase se veliko ukvarjam z sortiranjem, in že 2 uri razmišljam kako bi sortiral po večih atributih.

Če za spodnji primer uporabim Collection.sort in implementiram vmesnik Comparable, mi bo sortiral samo po enem atributu.

Stvar je v tem da moram drzave sortirat najprej po kolicini kave, če imata dve državi isto količino kave pridelane potem se gleda po kolicini krompirja itd...

Torej najprej po kavi, tista ki ima največ bo ta prva, če imata dve državi isto količino kave bo se gledalo po drugem atributu, če je še to isto pa po tretjem.



import java.util.ArrayList;

public class Drzava {
    
    String drzava;
    
    //kolicina v tonah
    
    int kolicinaKave;
    int kolicinaKrompirja;
    int kolicinaKruha;
    
    
    public Drzava(String drzava,int kava, int krompir, int kruh){
        this.drzava = drzava;
        this.kolicinaKave = kava;
        this.kolicinaKrompirja = krompir;
        this.kolicinaKruha = kruh;
    }
    
    public String toString(){
        return String.format("%s: Kava: %d Krompir: %d Kruh: %d", drzava,kolicinaKave,kolicinaKrompirja,kolicinaKruha);
    }
    
    
    public static void main(String args[]){
        ArrayList<Drzava> list = new ArrayList<Drzava>();
        list.add(new Drzava("ZDA",20,12,10));
        list.add(new Drzava("Brazilija",20,12,15));
        list.add(new Drzava("Kanada",10,12,5));
        
        for(Drzava e: list){
            System.out.println(e);
        }
    }
    
}



Hvala za vaš trud.

Spura ::

Uporabi comparator object

marjan_h ::

Hmm, ne vem če mi bo to sortiralo tako kot želim. Jaz želim, da mi sortira najprej po kavi in če sta kje državi ki imata enako količino kave, potem gleda količino krompirja in če še je to isto potem gleda naslednji atribut.

Verjetno bom moral svojo metodo napisati, ker vse te metode ki so implementirane v javo sortirajo samo po enem atributu.

Vsaj tako jaz mislim Spura. Če si pa ti mislil drugače mi pa razloži kako to doseči.


Hvala.

Mavrik ::

Saj točno to ti je Spura rekel. Narediš "Comparator" objekt, v katerem moraš implementirati metodo, ki bo primerjala objekte kot ti hočeš.

Poglej si "Comparator" v Javadoc in različico Collections.sort() metode, ki vzame Comparator.
The truth is rarely pure and never simple.

marjan_h ::

class Primerjava implements Comparator<Drzava>{
    
    public int compare(Drzava o1, Drzava o2){
        
    } 
}


Tako? Kako pa potem uporabiš slednji razred?

darkolord ::

list.OrderBy(d => d.kolicinaKave).ThenBy(d => d.kolicinaKrompirja).ThenBy(d => d.kolicinaKruha)


Aja, napačn jezik :P

Zgodovina sprememb…

  • spremenilo: darkolord ()

marjan_h ::

Dobro, saj vem da moram sam ugotoviti. Vendar po toliko urah še vedno ne razumem kako bi naredil.

@ darkolord
Če najprej sortiram po kavi, pa potem po krompirju, in šele potem po kolicini kruha, potem bom dobil, samo sortirano po kruhu.

Ne morem dojeti te logike, ki se skriva za rešitev te uganke.

jype ::

DirectX11> Če najprej sortiram po kavi, pa potem po krompirju, in šele potem po kolicini kruha, potem bom dobil, samo sortirano po kruhu.

Ne. ThenBy je operator, ki sortira samo znotraj tega.

V javadoc ti piše, kaj vrača comparator:

http://docs.oracle.com/javase/6/docs/ap...

Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.

V Pythonu zgleda tako:

sorted(list, cmp=lambda x, y:cmp(x.kava, y.kava) or cmp(x.krompir, y.krompir))

Mavrik ::

marjan_h je izjavil:


Tako? Kako pa potem uporabiš slednji razred?


Hmm, a morda nisem dovolj jasno napisal da si poglej "Collections.sort()" metodo, ki sprejme comparator?
The truth is rarely pure and never simple.

Spura ::

darkolord je izjavil:

list.OrderBy(d => d.kolicinaKave).ThenBy(d => d.kolicinaKrompirja).ThenBy(d => d.kolicinaKruha)


Aja, napačn jezik :P

Mhm, in kaj naredis, ko rabis da je sort po stringu case insensitive in v skladu s slovenscino, pa da so vsi elementi z null vrednostjo na koncu?
Isto vprasanje za python.

Zgodovina sprememb…

  • spremenil: Spura ()

marjan_h ::

@Mavrik

sem si pogledal Collection.sort in res sprejme arrayList in podatkovni tip Comparator.

Edino te sintakse ne poznam.
Comparator<? super T>


Kaj tisti vprašaj pomeni?

Sem potem prav naredil ko sem napisal svoj razred Primerjava ki implementira vmesnik Comparator?

Hvala, logiko pa bom poskušal sam ugotoviti, lahko mi pa samo psevdokodo napišete.

jan_g ::


class Primerjava implements Comparator<Drzava>{
    
    public int compare(Drzava d1, Drzava d2){
        
    } 
}


Tako? Kako pa potem uporabiš slednji razred?


Comparator uporabiš tako, da tista metoda vrne negativno vrednost, nič ali pozitivno vrednost, če je d1 manjša, enaka ali večja od d2. Se pravi, pri tebi bi bilo približno tako:
class Primerjava implements Comparator<Drzava>{
    
    public int compare(Drzava d1, Drzava d2){
        return d1.kolicinaKave == d2.kolicinaKave ? 
            d1.kolicinaKrompirja - d2.kolicinaKrompirja : d1.kolicinaKave - d2.kolicinaKave;
    } 
}


In če imaš bolj zapletene pogoje (kot je navedel spura), se ta metoda ustrezno temu zakomplicira :), ampak glavno je to, da vedno primerjaš med sabo dva elementa. Sortira se potem interno s Collections.sort(..).

darkolord ::

Mhm, in kaj naredis, ko rabis da je sort po stringu case insensitive in v skladu s slovenscino, pa da so vsi elementi z null vrednostjo na koncu?

Npr:
list.OrderBy (a => a ?? "\xFF", StringComparer.CurrentCultureIgnoreCase)


Če ne pa pač narediš svoj Comparer.

Zgodovina sprememb…

  • spremenilo: darkolord ()

Spura ::

ne vem ce je xFF najvisji mozni znak, ce imas stresice pa unicode. Sicer pa tocno to, naredis pac svoj komparator.

darkolord ::

Pa lahko daš še (naj)višjega. Ampak za sortirat "int kolicinaKave;" ne rabiš nič od tega ;)

jype ::

Spura> Sicer pa tocno to, naredis pac svoj komparator.

Saj tista lambda v mojem izrazu _je_ "moj komparator".

DirectX11> Kaj tisti vprašaj pomeni?

Zgodovina sprememb…

  • spremenilo: jype ()

marjan_h ::

Hvala jype sem si pogledal.


Vredno ogleda ...

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

[Java] Podatkovni tip

Oddelek: Programiranje
233488 (3140) piki12
»

[Java] Sortiranje razredov

Oddelek: Programiranje
101336 (1083) Spura
»

java dedovanje

Oddelek: Programiranje
51254 (1100) xsenon
»

C# Program

Oddelek: Programiranje
392961 (1884) Spura
»

[Java] Sortiranje objektov

Oddelek: Programiranje
192678 (2678) tjaz24

Več podobnih tem