Java Worvervollständigung

05/22/2017 14:17 QFireball#1
Hallo,

ich arbeite gerade an einer Bildschirmtastatur und jetzt wird darüber nachgedacht eine Auto Wortvervollständigung oder wie beim Navi das nicht mehr mögliche Buchstaben ausgegraut werden zum Implementieren. Hat da jemand ahnung von? Irgendwelche ansetzte oder Tutorial in der richtig die mir helfen könnten?
05/22/2017 14:25 Skriptum#2
Ansatz wäre z.B. du hast eine Liste mit Wörter, am besten noch zu jedem Wort ein Wert der angibt wie das Wört zu priorisieren ist. Und nach jeder Eingabe der Bildschirmtastatur wird über diese Liste iteriert und die passenden Wörter entsprechend der Priorisierung angezeigt. Musst halt überprüfen, ob der bisherige String in den Wörter in der Liste enthalten ist.
Das wäre das Grundprinzip. Könnte evtl. performance Probleme geben, aber da würde ich mir an deiner Stelle erstmal später Gedanken machen. Da gibt es einige Wege das Problem zu lösen.

Am besten erstmal mit ein paar Wörter ausprobieren und die Funktionalität herstellen.
05/22/2017 14:43 QFireball#3
Wäre es möglich auch die liste in eine externe datei aus zu lagern? Mein Gedanke war das ich immer das was schon geschrieben wurde mit der liste vergleiche und dann die Buchstaben sperre die unterhalb dieser wörter als nächstes nicht mehr vorkommt. Das wäre dann der Navi Ansatz. Müsste doch theoretisch leichter sein oder? Problem ist halt das ich dafür nicht mehr als 8 Wochen zeiz hätte dann muss es laufen oder es wird erstmal nicht umgesetzt.
05/22/2017 14:51 Skriptum#4
Quote:
Originally Posted by QFireball View Post
Wäre es möglich auch die liste in eine externe datei aus zu lagern? Mein Gedanke war das ich immer das was schon geschrieben wurde mit der liste vergleiche und dann die Buchstaben sperre die unterhalb dieser wörter als nächstes nicht mehr vorkommt. Das wäre dann der Navi Ansatz. Müsste doch theoretisch leichter sein oder? Problem ist halt das ich dafür nicht mehr als 8 Wochen zeiz hätte dann muss es laufen oder es wird erstmal nicht umgesetzt.
Klar, du kannst die Wörter auch in einer externen Liste speichern.
Dann muss dein Programm diese Liste auslesen und aus jedem Eintrag am besten ein Objekt machen und das dann in einer Liste bereithalten.
Die Objekte sollten dann als Klassenvariablen das Wört als String und evtl ein Integer, der die Priorisierung angibt, enthalten.
05/22/2017 22:10 algernong#5
Hast du bei dem Ansatz keine Bedenken? Immerhin können dann nur noch Wörter eingegeben werden, die in der Liste vorkommen. Das macht Sinn, wenn das Programm mit anderen Wörtern ohnehin nichts anfangen kann (Navi), in anderen Fällen aber nicht (vor allem in freien Texten). Macht das für dein Programm Sinn?

Ich denke, das geht noch effizienter als mit der Liste. Spontane Idee: Du baust einen Baum auf, so, dass jede Kante mit einem Buchstaben beschriftet ist. Dann entspricht jedes Blatt (bzw. auch nicht Blatt) dem Wort, das man bekommt, wenn man die Buchstaben auf dem Pfad zur Wurzel aneinander hängt (gelesen von Wurzel zu Blatt).
Den Baum musst du für eine Liste an Wörtern nur einmal aufbauen und kannst ihn dann speichern; er braucht nicht wesentlich mehr Speicherplatz als die Liste selber und vor allem: Du kannst in konstanter Zeit (bzw. Alphabetgröße) entscheiden, welche Buchstaben als nächstes noch eingegeben werden dürfen, denn dazu musst du nur die ausgehenden Kanten vom aktuellen Knoten traversieren. Wenn dann der nächste Buchstabe kommt, gehst du die Kante mit entsprechender Beschriftung entlang und setzt den neuen Knoten als aktuellen Knoten.

Edit: [Only registered and activated users can see links. Click Here To Register...]
Code:
Type on of: " # $ % & ' ( ) * - . 0 1 2 3 4 5 6 7 8 9 < > @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] a b c d e f g h i j k l m n o p q r s t u v w x y z } ~ Ä É Ö Ü ß à ä ö ü Œ Δ α β δ η μ π σ ‰ € 
W
You typed: W
Type on of: - C D E G H K M R S T W a e h i l o r u ä ö ü 
e
Type on of: a b c d e g h i l m n r s t y 
l
Type on of: c l p s t 
t
You typed: Welt
Type on of:   a b c e f g h k l m o p r s t u v w 
e
Type on of: n 
n
Type on of: b d i l 
b
Type on of: e r u 
e
Type on of: r 
r
Type on of: g 
g
You typed: Weltenberg
No more words with this prefix; abort
Braucht einmal am Anfang, bis der Suchbaum aufgebaut ist (den man, einmal aufgebaut, auch speichern könnte); ab dann sehr effizient. :)
05/23/2017 12:42 Zunft#6
Auch wenn du schon einen Ansatz hast, ich würde mit SQL arbeiten (in der lokalen Umgebung mit SQLite). Hier kannst du mit einfachsten Mitteln dein Ziel erreichen. Eine Datenbank ist um einiges schneller als den Text einer Datei zu lesen. Hier ein Beispiel:

Eine einfache Datenbank gefüttert mit deinen zu vervollständigen Städten/Orten/etc. Hier in simpelster Form:

IDWert
1Weissbrot
2Schwarzbrot
3Brotmesser
4Broetchen

Wir möchten gerne das Wort "Brot" vervollständigen (nach "links" und "rechts").

Das übernimmt für uns eine SQL Abfrage:

Code:
SELECT WERT FROM test_auto_fill WHERE WERT LIKE '%brot%';
Die '%'-Zeichen sind hier sogenannte Wildcards.

Resultat:

Wert
Weissbrot
Schwarzbrot
Brotmesser