[java] Vector met objecten sorteren

Pagina: 1
Acties:

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Hallo,

Ik heb het hele forum al doorzocht en heb google al tot waanzin gedreven door mijn zoekacties maar ik kom er niet uit.

Ik wil een Vector met objecten sorteren met een comparator maar ik ben een beetje nieuw in dit gedeelte van Java en loop dan ook helemaal vast.

Ik had al een comparator geschreven voor een array maar ik ben van arrays afgestapt omdat deze niet dynamisch in grootte zijn. Hier is de comparator:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Club {
    ...
    
    public boolean sorteer (Club club) {
    boolean returnWaarde;
    
    if (this.intPunten > club.intPunten)
        returnWaarde = true;
    else if (this.intPunten == club.intPunten && this.intGespeeldeWedstrijden < club.intGespeeldeWedstrijden)
        returnWaarde = true;
    else if (this.intGespeeldeWedstrijden == club.intGespeeldeWedstrijden && this.intGescoordeDoelpunten < club.intGescoordeDoelpunten)
        returnWaarde = true;
    else if (this.intGescoordeDoelpunten == club.intGescoordeDoelpunten && this.intGewonnenWedstrijden < club.intGewonnenWedstrijden)
        returnWaarde = true;
    else
        returnWaarde = false;
    
    return returnWaarde;
    }
}

Hoe krijg ik deze comparator nou werkend op een vector? Nogmaals, ik heb alles al afgezocht maar echt niets bruikbaars (voor mij) gevonden.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19-05 16:17

Robtimus

me Robtimus no like you

*kuch* java.util.Collections#sort(List, Comparator) *kuch*

Vector is een implementatie van List, dus je kan die static functie gewoon gebruiken.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
IceManX geeft in principe antwoord op je vraag.

Als alternatief kun je overwegen om een gesorteerde collectie bij te houden (zodat elementen altijd op de goede plaats staan) in plaats van eerst een collectie te bouwen en die daarna te sorteren. Een gesorteerde collectie is bijvoorbeeld een TreeSet.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 19-05 16:17

Robtimus

me Robtimus no like you

Soultaker schreef op woensdag 01 december 2004 @ 18:36:
IceManX geeft in principe antwoord op je vraag.

Als alternatief kun je overwegen om een gesorteerde collectie bij te houden (zodat elementen altijd op de goede plaats staan) in plaats van eerst een collectie te bouwen en die daarna te sorteren. Een gesorteerde collectie is bijvoorbeeld een TreeSet.
Je moet dan wel onthouden dat er geen 2 identieke elementen (dwz: compareTo levert 0 op) in kunnen zitten. Bij een List zoals Vector kan dat wel.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Ik werk nu met een booleaanse return value. Is dat ook wel goed? Ik heb veel gezien die integers gebruiken maar ik neem aan dat 0 voor false en 1 voor true ook voldoet?

  • Bobco
  • Registratie: Januari 2001
  • Laatst online: 30-10-2023

Bobco

I used to dream about Verona.

Ik zie in je code niet terug dat je een 'echte' Comparator gebruikt. Een Comparator implementeert de java.util.Comparator interface. Dat zijn maar twee methods:

public int compare(Object o1, Object o2);
public boolean equals(Object o1);

Als je deze interface implementeert kun je de IceManX oplossing gebruiken. Het handige van deze opzet is dat je heel gemakklijk verschillende sorteringen kunt maken zonder dat je bijvoorbeeld je Club object wijs hoeft te maken hoe die gesorteerd kan worden.

With the light in our eyes, it's hard to see.


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Ik ben aan het werk gegaan met deze tips alleen krijg ik een foutmelding bij de volgende code:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class vergelijkClub implements Comparator {
    public int compare(Club club_1, Club club_2) {
    int returnWaarde;
    
    if (club_1.intPunten > club_2.intPunten)
        returnWaarde = 1;
    else if (club_1.intPunten == club_2.intPunten && club_1.intGespeeldeWedstrijden < club_2.intGespeeldeWedstrijden)
        returnWaarde = 1;
    else if (club_1.intGespeeldeWedstrijden == club_2.intGespeeldeWedstrijden && club_1.intGescoordeDoelpunten < club_2.intGescoordeDoelpunten)
        returnWaarde = 1;
    else if (club_1.intGescoordeDoelpunten == club_2.intGescoordeDoelpunten && club_1.intGewonnenWedstrijden < club_2.intGewonnenWedstrijden)
        returnWaarde = 1;
    else
        returnWaarde = -1;
    
    return returnWaarde;
    }
}

Bij class vergelijkClub implements Comparator { krijg ik deze fout:
Java:
1
HD9.java:342: vergelijkClub is not abstract and does not override abstract method compare(java.lang.Object,java.lang.Object) in java.util.Comparator

Hij wil de compare uit Comparator niet overriden maar waar ligt dat toch aan?

  • Daventry
  • Registratie: Oktober 2004
  • Laatst online: 21-04-2025
de methode compare verwacht als parameters twee Objecten ... dus moet zoiets worden als:

compare (Object club1, Object club2)

dan in je methode effe casten naar Club

(Club)club1

zoiets dus :)

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Hey bedankt! En de rest ook! Dit is hem geworden:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class vergelijkClub implements Comparator {
    public int compare(Object club1, Object club2) {
    int returnWaarde;
    Club    club_1,
        club_2;
    
    club_1 = (Club)club1;
    club_2 = (Club)club2;
    
    if (club_1.intPunten > club_2.intPunten)
        returnWaarde = 1;
    else if (club_1.intPunten == club_2.intPunten && club_1.intGespeeldeWedstrijden > club_2.intGespeeldeWedstrijden)
        returnWaarde = 1;
    else if (club_1.intGespeeldeWedstrijden == club_2.intGespeeldeWedstrijden && club_1.intGescoordeDoelpunten > club_2.intGescoordeDoelpunten)
        returnWaarde = 1;
    else if (club_1.intGescoordeDoelpunten == club_2.intGescoordeDoelpunten && club_1.intGewonnenWedstrijden > club_2.intGewonnenWedstrijden)
        returnWaarde = 1;
    else
        returnWaarde = -1;
    
    return returnWaarde;
    }
}

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 16-05 13:05
Mocht je er niet bij stil gestaan hebben:

Je doet hier een tweetal unchecked casts. Normaal gesproken zou je dan best wel billenkoek moeten krijgen, maar in dit geval is een ClassCastException verwacht gedrag (zie API docs Comparator.compare()).

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

The - DDD schreef op woensdag 01 december 2004 @ 22:37:
Mocht je er niet bij stil gestaan hebben:

Je doet hier een tweetal unchecked casts. Normaal gesproken zou je dan best wel billenkoek moeten krijgen, maar in dit geval is een ClassCastException verwacht gedrag (zie API docs Comparator.compare()).
De comparator is pas vanaf jdk 5.0 geparametriseerd. Daarvoor zul je toch zelf expliciet een classcast moeten aanbrengen.
Pagina: 1