ChilloutFuerst Geschrieben 14. April 2009 Geschrieben 14. April 2009 (bearbeitet) Ein freundliches Hallo zusammen, ich möchte für private zwecke gerne ein kleines Programm erstellen, dass mir für eine eigegebene Zahlenkette (maximal 12 Zahlen) alle möglichen Buchstabenkompinationen der Handytastatur entsprechend ausgibt, Z.B Eingabe : 423 Ausgabe: gad gae gaf gbd gbe usw. Ziel soll dann irgendwann sein alle möglichen Wörter zu erkennen, also muss ich die erstellte Liste von Wörtern nachher noch mit einem Wörtbuch vergleichen. Ist das technisch überhaupt möglich oder würde das im ende einfach solange dauern, dass ich die ganze Idee wieder verwerfen sollte?? Da ich selbst noch absoluter Java Beginner bin komme ich nicht so recht weiter. Vielleicht hat hier jmd einen guten Lösungsansatz. Auf Wunsch poste ich auch gerne den qt soweit ich ihn schon habe. Für jeden Vorschlag dankbar Gruße Chilloutfuerst Bearbeitet 14. April 2009 von ChilloutFuerst Zitieren
DominikJ Geschrieben 14. April 2009 Geschrieben 14. April 2009 Hey, also technisch ist das auf jedenfall möglich. Aber wie du schon richtig erkannt hast wird das seine Zeit dauern. Bei 12 Zeichen sind es ja schließlich um die 500.000 Kombinationsmöglichkeiten (3^12) (Denkfehler?) Aber wenn du ein Wörterbuch hast, wäre es dann nicht sinnvoller dieses in Zahlen zu übersetzen? abc = 2 def = 3 usw ... Das dann in einer Datenbank deiner Wahl abspeichern und bei Eingabe von einer kombination muss nurnoch aus dieser Datenbank selektiert werden. D.h. du hast einmaligen 'Rechenaufwand' und danach nurnoch Selektionsaufwand. Aber wo ist denn dein jetziges Problem? Querllcode wäre in jedem Falle hilfreich wenn du iwo probleme hast. Zitieren
kingofbrain Geschrieben 14. April 2009 Geschrieben 14. April 2009 Servus, also das sollte nicht so kompliziert sein. Als erstes musst Du wissen, welche zahlen welche Buchstaben bzw. Zeichen sein können. dieses Mapping merkst Du dir irgendwo. Jetzt kannst Du von durch die eingegebene Zahlenkette laufen und alle Kombinationen anzeigen. Dabei würde ich im ersten Ansatz so vorgehen: Am Anfang belege ich alle Zeichen der Ergebniskette mit deren kleinstem Zeichenwert. Danach gehe ich von rechts nach links über die Eingabeziffern und drehe jeweils das aktuelle Zeichen durch alle Werte. Jedesmal, wenn ich in der Ziffernfolge eine Stelle weiterwandere, lasse ich auch alle Kombinationen der bereits durchlaufenen Stellen erneut bilden. Im Endeffekt wie eine Art Kilometeranzeige an den alten (analogen) Tachos. Dort zählt das Zählwerk ja auch durch alle vorhandenen Kombinationen. Peter Zitieren
Sturm Geschrieben 14. April 2009 Geschrieben 14. April 2009 Da hast du dir aber einiges vorgenommen... Die technische Umsetzung ist nicht das Problem- eher schon die Zeit. Ich fange mal an zu rechnen... 6 Tasten haben 3 Buchstaben, 2 Tasten haben 4 Buchstaben -> ergibt 3,25 Buchstaben pro Taste. Wenn du 12 Zeichen eingibst, hast du ca. 3.25 ^ 12 Buchstabenkombinationen zu überprüfen, also ca. 1,4 Millionen mögliche Kombinationen. Wenn dein Wörterbuch 100.000 Wörter hat (was wohl nur ein Bruchteil aller möglichen deutschen Wörter ist) musst du 1,4 Millionen mal 100.000 Wörter überprüfen: Also 140.000.000.000 ziemlich oft. Die Lösung von DominicJ (der gerade schneller war ) hört sich gut an... Versuchs mal über den Weg. Zitieren
ChilloutFuerst Geschrieben 14. April 2009 Autor Geschrieben 14. April 2009 Erstmal Dank für die schnellen Antworten. Also bisher habe ich das Ganze so gemacht: ich habe zu erst einen String eingelesen, dessen länge bestimmt und ihn dann ein eine double umgewandelt (valueOf); das Ganze habe ich dann in einzelne Ziffern zerteilt und die in einem int[] array mit laenge des Strings gespeichert; nun wollte ich die benötigten arrays mit den 3 buchstaben durch for schleifen laufen lassen bis alle möglichkeiten durch sind. Soviel zur Theorie. praktisch kann ich das aber irgendwie nicht umsetzen (wie gesagt Anfänger) Zitieren
smash Geschrieben 14. April 2009 Geschrieben 14. April 2009 Ohne lange nachgedacht zu haben, scheint es mit nicht supertrivial zu sein :eek. Um die verschiedenen Permutation zu erhalten, solltest du mal nach Kombinatorik Algorithmen suchen. Vielleicht könnte man das irgendwie als Baum strukturieren. Das waren meine Gedanken, so auf die Schnelle... Zitieren
ChilloutFuerst Geschrieben 14. April 2009 Autor Geschrieben 14. April 2009 Also nach weiteren Recherchen unter anderem auf der Seite des OpenSource Wörterbuchs GNU Aspell musste ich leider feststellen, dass das gnaze Projekt für mich völlig utopisch und nicht realisierbar geschweige denn kapierbar ist :-) Also gebe ich auf; falls trotzdem sich jmd. weiter damit beschäftigt und einen brauchbaren code für das generieren der Möglichkeiten hinbekommt; würde ich mich über einen kleinen post sehr freuen. Grüße Zitieren
Sturm Geschrieben 14. April 2009 Geschrieben 14. April 2009 (bearbeitet) Wie gesagt: Mit DominikJs Ansatz ist das Projekt vermutlich sehr viel einfacher und effizienter umzusetzen: Du brauchst zuerst ein Wörterbuch. In diesem Wörterbuch konvertierst du jedes Wort in einen Zahlencode. Gibst du später eine Zahl ein, musst du nur noch nach den Zahlen in deinem Wörterbuch schauen und das entsprechende Wort am Bildschirm ausgeben. Ein Beispiel: Nehmen wir an, dein Wörterbuch besteht aus drei Wörtern: HUND HAUS MAUS Im ersten Schritt konvertierst du alle Wörter im Wörterbuch in ihre Zahlenpendants: HUND -> 4863 HAUS -> 4287 MAUS -> 8287 (Das machst du natürlich nur einmal und speicherst dann die Kombinationen- muss ja nicht bei jedem Programmstart gemacht werden!) Dies geht im einfachsten Fall mit einfachen If-Abfragen (oder Switch-Case). Du zerlegst z.B. HUND in ein Array mit der Größe 4: {H, U, N, D}. Jetzt gehst du jeden einzelnen Buchstaben durch und wandelst ihn in die entsprechende Zahl um. Aus H wird 4, aus U 8, aus N 6, aus D 3. Das speicherst du und machst das gleiche mit dem nächsten Wort - so lange bis alle Wörter im Wörterbuch durch sind. Ich persönlich würde dafür eine simple Datenbank anlegen und die Wörter mit ihren zugehörigen Zahlenkombinationen dort speichern. Nun musst du nur noch in deinem Programm bei jeder Eingabe einer Zahl eine Datenbanküberprüfung machen: Gibst du 4863 ein durchsucht dein Programm die Datenbank und findet exakt einen Eintrag, nämlich "HUND". Daraufhin gibst du eben dieses Ergebnis aus. Das funktioniert dann natürlich auch mit HAUS, MAUS und jedem anderen Wort in deiner Datenbank. Ich hoffe, dass hat dir ein wenig weitergeholfen. Bei Rückfragen einfach hier im Thread schreien Bearbeitet 14. April 2009 von Sturm Zitieren
ChilloutFuerst Geschrieben 14. April 2009 Autor Geschrieben 14. April 2009 Das hat mir prinzipiell schonmal sher geholfen; leider kenne ich mich java halt so wenig aus als dass ich bei verbindungen zu datenbanken hoffnungslos scheitern würde... Werde den Tag über mal ein wenig rumprobieren und gegen abend mal meinen Lösungsansatz posten Zitieren
pascal87 Geschrieben 14. April 2009 Geschrieben 14. April 2009 leider kenne ich mich java halt so wenig aus als dass ich bei verbindungen zu datenbanken hoffnungslos scheitern würde... Google mal nach JDBC, in Verbindung mit ner MySQL DB (kannst ja XAMPP nehmen) ist das wirklich recht schnell umgesetzt und du hast ne gute Basis, arbeitest du im Moment mit ner .txt Dateien? Zitieren
DominikJ Geschrieben 14. April 2009 Geschrieben 14. April 2009 Joa, für seine Begriffe is MySQL dann aber vllt zu hoch gegriffen. Würde da einfach ne SQLite db hinter hängen. Gleiche suche nur anstatt MySQL SQLite Zitieren
ChilloutFuerst Geschrieben 15. April 2009 Autor Geschrieben 15. April 2009 Momentan mache ich da gar nichts mehr dran. Lerne jetzt erstmal GUI das verwirrt mich schon genug; und dann mal weitersehen....Vielleicht hat ja von euch einer Muße dazu es mal zu basteln; mit sicherheit ließe sich dass ganze nachher auch als t9 für java programme auf symbian telefonen einsetzen Zitieren
ChilloutFuerst Geschrieben 16. April 2009 Autor Geschrieben 16. April 2009 Hallo zusammen, habe meinen qt wie folgt zusammen; Leider werde aus mir unerklärlichen Gründen die permutierten Strings doppelt bis drefach ausgegeben... Hat jmd. eine Idee warum?? import java.io.*; public class Codieren { static int laenge; static char[] feld; static String s; static Codieren code = new Codieren(); public static int[] split (String input) { int[] intArray = new int[input.length()]; for(int i = 0; i < input.length(); i++) { intArray[i] = Integer.parseInt(input.substring(i, i+1)); } return intArray; } public String stringcompose(int[] zfeld) { String returnString = ""; for (int i = 0 ; i < zfeld.length; i++) { switch(zfeld[i]) { case 0: returnString += ""; break; case 1: returnString += ""; break; case 2: returnString += "abc"; break; case 3: returnString += "def"; break; case 4: returnString += "ghi"; break; case 5: returnString += "jkl"; break; case 6: returnString += "mno"; break; case 7: returnString += "pqrs"; break; case 8: returnString += "tuv"; break; case 9: returnString += "wxyz"; break; default: returnString += ""; } } /*System.out.println("String: "+returnString); System.out.println("Laenge: "+returnString.length()); System.out.println("LaengeArray: "+returnString.toCharArray().length);*/ code.perm(returnString.toCharArray(), returnString.toCharArray().length); return returnString; } static void perm(char[] a, int endIndex) { if (endIndex == 0) ausgabe(a); else { perm(a, endIndex -1 ); for (int i = 0; i < endIndex ; i++) { vertausche(a, i, endIndex -1); perm(a, endIndex-1); vertausche(a, i, endIndex - 1); } // for i } } // perm static void vertausche(char[] a, int i, int j) { char ablage = a[i]; a[i] = a[j]; a[j] = ablage; } static void ausgabe(char[] a) { for (int i = 0; i < a.length ; i++) { System.out.print(a[i]); } System.out.print("\n"); } // ausgabe public static void main(String args[]) throws IOException { BufferedReader din = new BufferedReader (new InputStreamReader (System.in)); System.out.print("Geben Sie die Zahl ein: "); s = din.readLine(); laenge = s.length(); code.stringcompose(split(s)); } } Zitieren
Sturm Geschrieben 16. April 2009 Geschrieben 16. April 2009 (bearbeitet) Ich verstehe zwar nicht, wieso es jetzt doch so gemacht werden soll, aber okay... Hast du den Debugger schon kennengelernt? EDIT: Apropos Debugger- benutzt du zum Programmieren Eclipse? Bearbeitet 16. April 2009 von Sturm Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.