Ich habe eine Methode geschrieben, die ein Paar Integer-Werte als Array verpackt in ein Vector schreibt. Es sollen aber nur die Integer-Werte in den Vector geschrieben werden, wenn diese dort nicht schon vorhanden sind. Diese Prüfung funktioniert bei mir leider nicht und ich verstehe nicht weshalb.
So funktioniert das nicht. Du schaust nach, ob ein neu angelegtes Array schon im Vector ist. Das kann aber nicht sein, da alle Arrays verschiedene Objekte sind.
Ein paar Tipps:
1. Verwende keine Integer-Arrays sondern mach dir eine eigene Klasse (IntPair oder so). Da kannst du dann equals() und hashcode() entsprechend implementieren.
2. Verwende keinen Vector sondern das Interface List und z.B. ArrayList als Implementierung.
3. Für dieses Problem sind Listen uneffektiv, da sie ständig durchsucht werden müssen. Mach dich mit Sets und Maps vertraut, vielleicht passt das besser.
4. Verwende keine Unterstriche in Variablennamen. Das ist gegen die Code-Konventionen.
1. Verwende keine Integer-Arrays sondern mach dir eine eigene Klasse (IntPair oder so). Da kannst du dann equals() und hashcode() entsprechend implementieren.
Danke für deine tollen Tipps! Ich habe jetzt eine Klasse "IntPair()" geschrieben (siehe unten) und deren Objekte speichere ich in einer HashSet. Weshalb eigentlich kein Vector? Wegen der Eigenschaft des Hashsets die Objekte einmalig zu speichern?
Java:
publicclassIntPair{privateint a;privateint b;publicIntPair(int a,int b){this.a = a;this.b = b;}@OverridepublicinthashCode(){returnthis.a *100+this.b;}@Overridepublicbooleanequals(Object that ){if( that ==null){returnfalse;}if(getClass()!= that.getClass()){returnfalse;}if(this.a !=((IntPair)that).a ||this.b !=((IntPair)that).b ){returnfalse;}returntrue;}publicintgetA(){returnthis.a;}publicintgetB(){returnthis.b;}
Hast du noch Verbesserungsvorschläge für diese Klasse? Mich stören ja ein wenig die Namen der Eigenschaften "a" und "b". ;-)
Bezüglich der Code-Konventionen ist es dann sinnvoller die Namen der Eigenschaften durch "this." kenntlich zu machen?
Ja, für mich sahen deine Anforderung so aus, als ob du jedes Paar nur einmal haben willst. Ich kenn allerdings das konkrete Problem nicht.
Einen Vector musst du jedes Mal von vorne bis hinten durchsuchen. Der Zugriff in ein HashSet passiert sofort.
Hast du noch Verbesserungsvorschläge für diese Klasse?
Nichts wichtiges. Du könntest die Member-Variablen final deklarieren - die Klasse ist ja offensichtlich immutable. Das final würde dafür sorgen, dass auch so bleibt und nicht aus Versehen durch irgendwelche Quelltextänderungen verloren geht. Außerdem gibt es einen Performance-Vorteil - zumindest theoretisch.
Die Berechnung des Hashcode kann man eventuell noch optimieren. Normalerweise nimmt man als Faktor eine Primzahl (statt 100). Das hilft dabei, Kollisionen zu vermeiden. Aus welchem Wertebereich sind denn die Integer?
Mich stören ja ein wenig die Namen der Eigenschaften "a" und "b".
Ja, für mich sahen deine Anforderung so aus, als ob du jedes Paar nur einmal haben willst. Ich kenn allerdings das konkrete Problem nicht.
Einen Vector musst du jedes Mal von vorne bis hinten durchsuchen. Der Zugriff in ein HashSet passiert sofort.
Das hattest du richtig erkannt. Von daher bin ich mit dem HashSet auch sehr zufrieden!
Nichts wichtiges. Du könntest die Member-Variablen final deklarieren - die Klasse ist ja offensichtlich immutable. Das final würde dafür sorgen, dass auch so bleibt und nicht aus Versehen durch irgendwelche Quelltextänderungen verloren geht. Außerdem gibt es einen Performance-Vorteil - zumindest theoretisch.
Ja, die Klasse ist wirklich als immutable gedacht und ich habe die Eigenschaften soeben final deklariert.
Die Berechnung des Hashcode kann man eventuell noch optimieren. Normalerweise nimmt man als Faktor eine Primzahl (statt 100). Das hilft dabei, Kollisionen zu vermeiden. Aus welchem Wertebereich sind denn die Integer?
Diese ursprünglich gepostete Methode ist ein Teil eines ViewModels, in dem ich unter anderem speicher welche Tabs in einem JTabbedPane geöffnet sind. Eigentlich sollten dort nicht mehr 10 Tabs offen sein.
Keine Ahnung, welche Bedeutung diese Werte haben. Da kann ich dir nicht helfen. Zur Not nenn sie eben "first" und "second" oder so.