Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
h. bekomm bei meinem prog nen stackoverflow fehler und ich weiss nciht wie ich den abstellen soll.
hier mal meine add methode wo der fehler ausgelöst wird
Code:
public class MyHashMap<E,F>{
private E value1;
private F value2;
private MyHashMap<E,F> next;
/*Prüft, ob HashMap leer ist*/
public boolean isEmpty(){
return value1 == null && value2 == null;
}
/*Fügt Element in die HashMap ein*/
public void add(E value1, F value2){
if(isEmpty()){
this.value1 = value1;
this.value2 = value2;
next = new MyHashMap<E,F>();
}
else
next.add(value1,value2);
}
next.add(value1,value2); die zeile wird mir als fehler angezeigt..
klar ist mir das die methode unendlich oft aufgerufen wird allerdings weiß ich nciht genua was ich für ne if bedingung einbauen soll damit sie sich nicht unendlich mal aufruft...
also ich lesen aus einem txt file ein da sieht mein code so aus:
Code:
public class ReadLog {
public MyHashMap<String, String> log = new MyHashMap<String, String>();
/*Liest Log aus, und speichert Inhalt in eine HashMap*/
public MyHashMap<String, String> readLog(MyHashMap<String, String> log, String path){
try{
BufferedReader in = new BufferedReader(new FileReader(path));
String s;
while((s = in.readLine())!= null)
log.add(s.substring(0,13), s.substring(18));
in.close();
}catch(FileNotFoundException e){
System.err.println("Datei nicht gefunden!");
}catch(IOException e){
System.err.println("Fehler!");
}
return log;
}
und das sind meine knoten die in einer extra classe liegen
Code:
public class MyHash<E,F> {
E var1;
F var2;
public MyHash(E var1, F var2){
this.var1 = var1;
this.var2 = var2;
}
}
in der main rufe ich dann einfach
Code:
public class Main {
public static void main(String[] args) {
ReadLog log = new ReadLog();
log.readLog(log.log, "C:/Users/eld/Eigene Dateien/workspace/AD/src/a11/AD_weblog.log");
log.print(log.log);
also ich hab noch mal bissl getestet und zwar muss es an der add methode liegen. bei vielen werten läuft sich die methode tot.
weil er bei jedem element dass er einfügen will immer iweder ganz vorne in der liste anfängt und dann solange durch geht bis ein platz am ende frei ist.
und bei nächsten wert wieder ganz vorne anfängt. kann man das irgendwie hinbekommen das er nicht vorne wieder anfängt?
eine Rekursion ist da wirklich sinnlos,
wenn dann mach ne Schleife:
X run = ..;
while(noch ein next möglich) {
run = run.next();
}
aber auch diesen unnötigen Durchlauf kannst du dir sparen, wenn du dir das letzte Element der Liste irgendwo merkst,
am besten in einem übergeordneten Gesamt-Objekt,
das ganze ist bisher übrigens eine verkettete Liste, keine Map?!
also dass du einen stackoverflow bekommst ist ziehmlich klar denke ich, weil:
Code:
next.add(value1,value2);
aufgerufen wird und:
Code:
private MyHashMap<E,F> next;
das heißt, wenn next noch leer ist, wird eine neue MyHashMap in next erzeugt.
sobald das nächste mal add aufgerufen wird ist next nicht leer, also ruft die funktion add sich selber auf.
das macht sie dann solange, bis es einen stackoverflow gibt.