Zum Inhalt springen

Empfohlene Beiträge

Geschrieben (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 von ChilloutFuerst
Geschrieben

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.

Geschrieben

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

Geschrieben

Da hast du dir aber einiges vorgenommen...

Die technische Umsetzung ist nicht das Problem- eher schon die Zeit. Ich fange mal an zu rechnen... :D

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.

Geschrieben

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)

Geschrieben

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...

Geschrieben

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

Geschrieben (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 :D

Bearbeitet von Sturm
Geschrieben

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

Geschrieben
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?

Geschrieben

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

Geschrieben

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));







	}


}

Geschrieben (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 von Sturm

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...