Java String auf das Alphabet prüfen

Ken Masters

Lt. Junior Grade
Registriert
Dez. 2006
Beiträge
334
Hallo, ich habe eine frage, und zwar möchte ich einen String überprüfen, ob ALLE buchstaben
vom alphabet vorkommen, also kurz gesagt ob der satz/string/word ein pangramm ist.

falls ja sollte true wiedergegeben werden, sonst false.

mein code:

.....
static boolean satz_pangramm(String text){

if ( Pattern.matches("[a-zäüöÄÜÖA-Z]", text)){
return true;
}

else return false;
}
}


jedesmal bekomme ich false. was habe ich falsch gemacht?

ich danke im voraus.
 
Ich würde vorher Whitespaces und Sonderzeichen strippen - Versuchs mal manuell und übergib zunächst mal den Satz ohne Punkt und Komma.
 
ich verstehe leider nicht was du meinst SC6!

es klingt so, als wenn es komplizierter wird als mein gedanke/vorgehensweise.
 
Du bekommst nur true, wenn der String genau einen Buchstaben enthält. Für längere Strings musst du noch "*" an das Pattern hängen (oder "+" für mindestens einen Buchstaben).
 
hi,
was hast du denn als text übergeben?
Was sc6 meint ist falls du nen Satz "Hallo Welt" übergibst ist da nen ' ' (Leerzeichen) mit drin -> false
falls irgendwelche Anführungszeichen in text vorkommen genau das gleiche.

Fehlt da nicht nen * ?

gruß
 
aaahhh sauber jungs. danke ;))

habe einfach alle buchstaben von der tastatur als eingabe verwendet.

wie ihr es bereits gesagt habt, fehlte das *-zeichen. ;)

nur hinter der eckigen klammer einfügen, fertig. dankee ;)



EDIT:

ich muss mich korrigieren. jetzt wird immer true ausgegeben. selbst wenn ich nur ein a schreibe.

es soll aber NUR DANN truhe sein, wenn wirklich alle buchstaben vorkommen
 
Du versuchst etwas mit regulären Ausdrücken zu lösen, wofür sie (meines Wissens) nicht geeignet sind.
Es mag sein, dass es mit irgendwelcher Zusatzsyntax mit RegEx lösbar ist, aber da ist es sinnvoller eine Lösung zu nehmen die einfach und offensichtlich ist ( KISS-Prinzip )

Was du dir überlegen solltest ist ein Algorithmus, der prüft, ob jedes Zeichen des Alphabets im Satz enthalten ist.
Eine Lösung zu finden die funktioniert ist dabei nicht schwierig. Interessant wird es dann nochmal, wenn man sich über die Effizienz Gedanken macht.
 
ich könnte das ja folgendermaßen machen:

das alphabet in ein array packen, dann die einzelnen buchstaben nacheinander im string suchen. sobald keins gefunden wird -> false.

aber ich wollte nach einer (wie oben) einfacheren lösung suchen.
 
Ken Masters schrieb:
ich könnte das ja folgendermaßen machen:

das alphabet in ein array packen, dann die einzelnen buchstaben nacheinander im string suchen. sobald keins gefunden wird -> false.

aber ich wollte nach einer (wie oben) einfacheren lösung suchen.

Das ist bereits die einfache Lösung.

Solange du dem RegEx nicht beibringen kannst, dass jeder Buchstabe nur einmal auftreten darf, wird es damit nur komplizierter, falls es damit überhaupt lösbar ist.
 
Je nachdem was für Eingaben du hast, könntest du es auch noch beschleunigen, indem du sprachlich da ran gehst.
In deinem Alphabetarray z.B. mit häufigen Buchstaben beginnen: Vokale und dann die wichtigsten Konsonanten (das ist von der verwendeten Sprache abhängig).
 
Wie wärs damit (kurz und knackig):

Code:
    public static boolean isPangram(String s) {
        String alphabet = "QXYJßVPZKFWBOMGCLUHDTARSINE";
    
        for (char c : alphabet.toCharArray()) {
            if (s.indexOf(c) < 0 && s.indexOf(c + 32) < 0) {
                return false;
            }
        }
    
        return true;
    }

Die Umlaute dann einfach durch ae, oe und ue ersetzten.
 
Zuletzt bearbeitet: (ä, ö, ü ...)
thes33k schrieb:
Je nachdem was für Eingaben du hast, könntest du es auch noch beschleunigen, indem du sprachlich da ran gehst.
In deinem Alphabetarray z.B. mit häufigen Buchstaben beginnen: Vokale und dann die wichtigsten Konsonanten (das ist von der verwendeten Sprache abhängig).

Eigentlich wäre es doch sogar besser mit den seltensten Buchstaben zu beginnen. Dann kann man früher abbrechen, falls die nicht enthalten sind.
 
Für Effizienz würde ich ein Array mit allen Buchstaben anlegen (am besten mit new char[256];)
Und dann auf 0 initialisieren. Dann noch ein counter auf die anzahl der Buchstaben.
Nun jeden Buchstaben lesen (charAt()) und dann prüfen: Wenn im Array der Wert gesetzt ist, tue nichts, sonst count-- und Array auf 1 setzten.
Dadurch musst du das Array nur einmal durchlaufen und brichst mit dem ersten der letzten Buchstaben ab.
Code:
static boolean satzPanagramm(String text){
boolean arr=new boolean[256];
for(int i=0;i<256;++i)arr[i]=false;
int count=26*2+6;//a-zA-ZäöüÄÖÜ
for(int i=0;i<text.length;++i){
if(!arr[text.charAt(i)]){
arr[text.charAt(i)]=true;
counter--;
if(counter==0)return true;
}
return false;
}
Der Code setzt voraus, dass nur Buchstaben drin sind.
 
Und für noch mehr Effizienz kannst du statt nem boolean Array einfach ein Integer nehmen :eek: ;)
Code:
static boolean isPangram(String s)
{
	final int PANGRAM = 0x3FFFFFFF;
	int alphabet = 0;

	for (char c : s.toCharArray())
	{
		if ((c >= 'A') && (c <= 'Z'))
		{
			c += 32;
		}

		if ((c >= 'a') && (c <= 'z'))
		{
			alphabet |= (1 << (c - 'a'));
		}
		else if((c == 'ä') || (c == 'Ä'))
		{
			alphabet |= (1 << 26);
		}
		else if((c == 'ö') || (c == 'Ö'))
		{
			alphabet |= (1 << 27);
		}
		else if((c == 'ü') || (c == 'Ü'))
		{
			alphabet |= (1 << 28);
		}
		else if(c == 'ß')
		{
			alphabet |= (1 << 29);
		}			
		
		if (alphabet == PANGRAM)
		{
			return true;
		}
	}

	return false;
}

Sieht zwar für ein deutsches Pangramm etwas unübersichtlich aus, da man auch noch Umlaute und Sz beachten muss, ist aber dafür ziemlich schnell.
 
Zuletzt bearbeitet:
@DjNDB
Ja, du hast natürlich recht. In meinem Kopf war es komischerweise anders rum :) Aber natürlich durchläuft die Schleife am wenigsten, wenn man den mit Buchstaben anfängt, die mit geringster Wahrscheinlichkeit vorkommen :)
 
Erstmal danke an alle für die antworten und hilfen. sorry das ich jetzt erst antworte, habe nach meinem letzten post gestern abend hier im forum nicht mehr reingeschaut. habe es so gemacht und es funktioniert:


Code:
static boolean satz_pangramm(String text){
		

		char[] alphabet = {'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','ü','ä','ö'};

                 int k = 0;

                 text = text.replace(" ", "");

                 for(int j = 0; j < alphabet.length; j++) {
			 
			 for(int n = 0; n < text.length(); n++) {
				 
				 if(alphabet[j] == text.charAt(n)) {
					 
					  k++;
					  break;

	                         }			 			 				
			 }
	         }
		 
		 if ( k == 29) {
			 
			 return true;
		 }
		
		 else return false;
	}
}


ist etwas umständlicher, ich weiss. aber wie gesagt, habe ja gestern nicht mehr hier reingeschaut und meine lösung wollte ich auch nicht vorenthalten.

beim string werden leerzeichen weggenommen sodass nur ein wort entsteht. dann wird das alphabet begonnen mit a mit allen stringzeichen einzelnt verglichen. sobald es eine übereinstimmung gibt wird abgebrochen und k um eins erhöht. dann wird mit der nächsten buchstabe fortgesetzt. d.h. k kann somit höchstens 29 annehmen. falls das der fall ist, wird true ausgegeben.
 
Du hast jetzt nur den Fehler drin, dass nur kleine Buchstaben abgefragt werden.

Entweder du fragst zusätzlich nach großen ab oder du setzt den text auf Kleinbuchstaben um

Code:
String lowerCasetext = text.toLowerCase();

Umlaute sollte man auf Grund von kodierungs Schwierigkeiten im nicht so hinschreiben
Code:
char c = '\u00e4';
wäre ein ä.

Siehe hier http://de.wikipedia.org/wiki/Umlaut#UTF-8 für den Rest
 
Zuletzt bearbeitet:
@ dasBoeseLebt

jo danke. hast recht gehabt. habe nur die kleinen buchstaben verglichen. habe daher deinen vorschlag übernommen und alle zeichen vom string kleingesetzt. ;)

danke, jetzt ist es entgültig fertig :)
 
Zurück
Oben