alle gleichen String[] sollen gleichen hashcode bekommen....
hm....
- java
0 Whouzuo
hi leute,
ich hab das gebaut:
HashMap<Vector, Integer>
Meine klasse vector ist das da:
public String[] el;
public boolean n;
public Vector( String[] el, boolean n)
{
this.el = new String[el.length];
for(int i=0; i<el.length; i++)
this.el[i] = el[i];
this.n = n;
}
@Override
public boolean equals(Object obj)
{
Vector vec = (Vector) obj;
for(int i=0; i<vec.el.length; i++)
{
if(vec.el[i]!=this.el[i])
return false;
}
if(this.n != vec.n)
return false;
return true;
}
/*@Override
public int hashCode()
{
}*/
}
ich brauche, eine geeignete hashcode funktion, dabei ist aber das String[] mein großes problem.
im prinzip könnte ich eine hashmap<boolean, ArrayList<String[]>> anlegen und updaten, für jedes hinzukommende objekt vector. so dass ich immer eine hashcode zahl hätte. immer wenn der konstruktor einen "neuen vektor erstellt" wird einfach ein integer hochgezählt (is shitte, aber ich hab gerade ziemlichen zeitdruck, wegen einer prüfung, einem sample algo den ich machen soll [monte carlo mist], einem vortrag, den code, einen test etc. - das bezeichne ich übrigens als fluch der mathematik...).
also, mein problem ist, dass Sring[] trotz gleicher länge und gleichen elementen als ungleich angesehen werden (dass das so seine richtigkeit hat ist mir dabei wurst ^^).
kann ich die equals methode von String[] irgendwie manipulieren, so das gleicherzeugte objekte als gleich angesehen werden? oder mein problem anders wie lösen ohne viel aufwand?
danke für eure antworten :)
kann ich die equals methode von String[] irgendwie manipulieren, so das gleicherzeugte objekte als gleich angesehen werden? oder mein problem anders wie lösen ohne viel aufwand?
Dein Code zeigt, dass du wenig Erfahrung in Objektorientierung mit Java hast. Dass du unter Zeitdruck stehst, macht das natürlich nicht besser. Trotzdem wäre es sehr sinnvoll zu wissen, was du überhaupt genau tun willst und wofür dafür deine Vector Klasse (die du bitte einmal komplett hier zeigen solltest) dabei genutzt werden soll. Zudem ist dir hoffentlich bewusst, dass es bereits java.util.Vector gibt oder?
Dein Code zeigt, dass du wenig Erfahrung in Objektorientierung mit Java hast. Dass du unter Zeitdruck stehst, macht das natürlich nicht besser. Trotzdem wäre es sehr sinnvoll zu wissen, was du überhaupt genau tun willst und wofür dafür deine Vector Klasse (die du bitte einmal komplett hier zeigen solltest) dabei genutzt werden soll. Zudem ist dir hoffentlich bewusst, dass es bereits java.util.Vector gibt oder?
das ist meine komplette klasse vector :)
ich hab nie eine richtige ausbildung im programmieren gehabt, sondern das nebenbei in einem kurs für mathematiker gelernt, in dem aber nichts java spezifisches geprüft wurde sondern nur die beweise zur laufzeit von quicksort etc., turingmaschin, bellmanfort usw.. daher weiß ich nicht genau, was es noch über java zu wissen gibt. (im bachelor kann man als mathestudent leider keinen programmiergrundkurs einbringen, da wir java "nebenbei" in einem anderen kurs "lernen")
ein vector steht für einen knoten in einem graphen, welcher durch clustern erzeugt wird (im bereich algorithmen kenn ich mich ganz gut aus).
der vector enthält eigenschaften, wie alter, größe und wohnort einer person (das casten auf Integer habe ich in einer anderen programmversion. hier habe ich sie weggelassen, weil ich nur eine berechungsvariante testen muss und erwarte das mir der test anzeigen wird, dass mein anderes verfahren besser ist, brauche aber die test ergebnisse das zu belegen). außerdem enthält der vector einen boolean, der anzeigt ob diese person heute etwas gemacht hat oder ob sie heute nichts gemacht hat.
meine idee für einen hashcode ist:
ich beichere alles in dem string[] in einem normalen string mit komma getrennt und füge dies in eine arraylist ein.
so:
static HashMap<Boolean, HashMap<String, Integer>
Zu jedem Boolean, gibt es für alle String[] zeichenmketten einen Integer. Sehr unschön von mir, aber vielleicht klappt das, dass teste ich jetzt mal. (ich hätte eine datenbank verwenden sollen, glaube ich)
@@hm....:
nuqneH
(im bachelor kann man als mathestudent leider keinen programmiergrundkurs einbringen, da wir java "nebenbei" in einem anderen kurs "lernen")
<sarcasm>Man kann „Bachelor“ ins Deutsche als „Fachidiot“ übersetzen?</sarcasm>
Qapla'
@@hm....:
nuqneH
(im bachelor kann man als mathestudent leider keinen programmiergrundkurs einbringen, da wir java "nebenbei" in einem anderen kurs "lernen")
<sarcasm>Man kann „Bachelor“ ins Deutsche als „Fachidiot“ übersetzen?</sarcasm>
Qapla'
hm... ^^
der unterschied zwischen bachelor mathe und anderen bachelor abschlüssen ist, dass man bei mathe eine komplette vertiefung fertig macht, d.h. der master ist dem bachelor in mathe gleichweitig, da die im master gewählte vertifung leichter sein kann (aber bei mir wird sie schwerer, BA war bei mir algorithmisch diskrete mathematik (Min-Max Optimierung) und wird im MA finanzmathe (Analysis/Differentialgleichungen).
das beste wäre, wenn ich fachideot in stochastik und gleichzeitig fachideot im bereich softwareumsetzung wäre :D
so, jetzt ist der hashcode bei beiden vectoren gleich (hab ich mir ausgeben lassen)
code:
package persistentGraph;
import java.util.HashMap;
import controller.Controller;
public class Vector {
public String[] el;
public boolean n;
public Vector( String[] el, boolean n)
{
this.el = new String[el.length];
for(int i=0; i<el.length; i++)
this.el[i] = el[i];
this.n = n;
}
private String getKey(String[] e)
{
String key = "";
for(int i=0; i<e.length-1; i++)
key += String.valueOf(e[i]) + ";";
key += String.valueOf(e[e.length-1]);
return key;
}
@Override
public boolean equals(Object obj)
{
Vector vec = (Vector) obj;
for(int i=0; i<vec.el.length; i++)
{
if(vec.el[i]!=this.el[i])
return false;
}
if(this.n != vec.n)
return false;
return true;
}
@Override
public int hashCode()
{
String key = getKey(this.el);
if(n)
{
if(!Controller.code2.get(1).containsKey(key))
{
Controller.k_++;
Controller.code2.get(1).put(key, Controller.k_);
}
}
else
{
if(!Controller.code2.get(0).containsKey(key))
{
Controller.k_++;
Controller.code2.get(0).put(key, Controller.k_);
}
}
if(this.n)
return Controller.code2.get(1).get(getKey(this.el));
else
return Controller.code2.get(0).get(getKey(this.el));
}
}
aber trotzdem frisst er meine hashMap<Vector,Integer> nur einen der vectoren, nicht beide.
muss ich neben hashcode und equals noch irgendwas beachten?