Hallo zusammen!
Ich habe eine Art Typeahead-Funktion in einer kleinen JAVA-Anwendung implementiert. Es werden Elemente vom Typ Begriff in eine jList geladen und diese wird dann durchsucht. Eigentlich läuft das ganze auch zufriedenstellend und performant. Immerhin landen in der Liste ca. 40000 Einträge. Leider bleibt das Programm nach dauerhafter Benutzung dann irgendwann stehen. Ich habe schon zur Optimierung eine Alternative implementiert, die für den Fall, dass die vorherige Eingabe ein Substring der neuen Eingabe ist (deswegen gibt es zwei Suchparameter: den aktuellen Suchstring und den letzten). Allerdings passiert der Absturz auch immer bei der zweiten Version (im else-Teil). Ich hoffe, der Quellcode ist ausreichend, um das Problem zu verstehen.
Woran kann der Absturz liegen? Ich habe schon an einige Dinge gedacht:
Exceptions entstehen nicht, Laufzeitfehler gibt es auch nicht.
Vielen Dank für alle Hilfe!
Ich habe eine Art Typeahead-Funktion in einer kleinen JAVA-Anwendung implementiert. Es werden Elemente vom Typ Begriff in eine jList geladen und diese wird dann durchsucht. Eigentlich läuft das ganze auch zufriedenstellend und performant. Immerhin landen in der Liste ca. 40000 Einträge. Leider bleibt das Programm nach dauerhafter Benutzung dann irgendwann stehen. Ich habe schon zur Optimierung eine Alternative implementiert, die für den Fall, dass die vorherige Eingabe ein Substring der neuen Eingabe ist (deswegen gibt es zwei Suchparameter: den aktuellen Suchstring und den letzten). Allerdings passiert der Absturz auch immer bei der zweiten Version (im else-Teil). Ich hoffe, der Quellcode ist ausreichend, um das Problem zu verstehen.
Woran kann der Absturz liegen? Ich habe schon an einige Dinge gedacht:
- garbage Collection? Aber es werden ja keine Objekte neu erzeugt, die entsorgt werden müssten, sondern nur existierende durchsucht
- führt irgendeine Suche dazu, dass eine Endlosschleife läuft? Aber die gleiche Eingabe funktioniert manchmal und manchmal nicht
Exceptions entstehen nicht, Laufzeitfehler gibt es auch nicht.
Vielen Dank für alle Hilfe!
Java:
public void suchen1(String s, String old){
jList1.clearSelection();
BegriffListModel aktuellModel;
if (s.equals("")){
aktuellModel=jList1Model;
}else if(old!=null && !old.equals("") && s.contains(old)){
System.out.println("new s=" +s+" old="+old);
aktuellModel=(BegriffListModel)jList1.getModel();
for (int i=0;i<aktuellModel.size();) {
Begriff b=(Begriff)aktuellModel.elementAt(i);
String t=b.getWort();
if (!(t.length()>=s.length() && t.toLowerCase().contains(s.toLowerCase()))) {
tempModel.remove(i);
}else{i++;} // end of if
}
}else{
System.out.println("old s=" +s+" old="+old);
tempModel.clear();
aktuellModel=tempModel;
for (int i=0;i<jList1Model.size()-1;i++) {
Begriff b=(Begriff)jList1Model.elementAt(i);
String t=b.getWort();
if (t.length()>=s.length() && t.toLowerCase().contains(s.toLowerCase())) {
tempModel.addElement(b);
} // end of if
} // end of for
}
jList1.setModel(aktuellModel);
}