Is er een standaardset in java die een vergelijker kan maken voor gelijkheidscontroles, maar wordt herhaald in invoegvolgorde?

Ik heb een reeks objecten die ik niet kan aanpassen door hun gelijken of hashCode-functies te negeren (die zich niet gedragen zoals ik zou willen), maar waarvoor ik wel een comparator heb die zich gedraagt ​​zoals ik zou willen. Is er een set die ik zou kunnen gebruiken die gebruik maakt van de comparator om geen duplicaten toe te staan, maar wanneer itereert itereert dan invoegvolgorde?

In essentie ben ik op zoek naar een kruising tussen de TreeSet en LinkedHashSet. Iets als een LinkedTreeSet!

1

3 antwoord

Heeft u erover gedacht om een ​​klasse te maken die de objecten omwikkelt en een functie equals/hashCode implementeert die zich gedraagt ​​zoals u verwacht? Een beetje gedoe, maar je lijkt zware beperkingen te hebben.

En als je dit wel doet of als je iets meer geschikt vindt, zorg er dan voor dat je het op de juiste manier becommentarieert, of de volgende persoon zal de verkeerde aannames doen over gelijken/hashCode-methoden!

PS: a TreeSet still uses equals to rule out duplicates

2
toegevoegd
Ik denk dat dit een fout is in de javadoc van add, omdat de klassedocumentatie zegt: "een TreeSet-instantie voert alle elementvergelijkingen uit met de methode compareTo (ofvergelijking), dus twee elementen die door deze methode als gelijk worden beschouwd, zijn vanuit het oogpunt van de set, gelijk ".
toegevoegd de auteur JB Nizet, de bron
Dit is eigenlijk mijn huidige oplossing - en het werkt - maar ik vraag me af of er een datastructuur is die de wrapper-klasse niet nodig zou maken.
toegevoegd de auteur Zugwalt, de bron
Darn. Je hebt gelijk. Kijk in de code en schrijf een testprogramma voor het geval dat. Nooit een base-java javadoc fout gevonden voordat ...
toegevoegd de auteur Miquel, de bron
Meldde een bug aan orakel ... laten we eens kijken hoe dat gaat.
toegevoegd de auteur Miquel, de bron

TreeSet doesn't do what you want, either. It doesn't use the comparator to determine duplicates; it only uses it to preserve a sort order. From the Set docs:

Een verzameling die geen dubbele elementen bevat. Formeler bevatten sets geen paar elementen el en e2, zodanig dat e1.equals (e2) en ten hoogste één nulelement.

In het bijzonder in de TreeSet-documenten :

public boolean toevoegen (e e)

     

Voegt het opgegeven element toe aan deze set als dit nog niet aanwezig is. Formeler voegt het gespecificeerde element e aan deze set toe als de set geen element e2 bevat, zodanig dat (e == null? E2 == null: e.equals (e2)). Als deze set het element al bevat, laat het gesprek de set onveranderd en wordt false geretourneerd.

Ik denk niet dat het mogelijk is dat de Set de .equals() -methode van de objecten erin gebruikt. U moet de klasse uitbreiden en de methode .equals() overschrijven, of een klasse maken met de objecten die u in de set wilt plaatsen, als Miquel voorgesteld.

0
toegevoegd
Ik denk dat dit een fout is in de javadoc van add, omdat de klassedocumentatie zegt: "een TreeSet-instantie voert alle elementvergelijkingen uit met de methode compareTo (ofvergelijking), dus twee elementen die door deze methode als gelijk worden beschouwd, zijn vanuit het oogpunt van de set, gelijk ".
toegevoegd de auteur JB Nizet, de bron

Apache's commons-collections heeft een ListOrderedSet . Het klinkt als wat je wilt.

Versiert een andere set om ervoor te zorgen dat de volgorde van toevoeging behouden blijft   en gebruikt door de iterator.

Maar dit zal de comparator NIET gebruiken om te controleren op duplicaten ...

0
toegevoegd