Ziffernabfrage in Zeichenkette !

Status
Nicht offen für weitere Antworten.

Cyborg

Aktives Mitglied
Hallo ihrs,

Gibt es in der String-Klasse eine Methode, die überprüft, ob und evtl wieviel Ziffern in einem String vorhanden sind ?
Oder gibt es ne Möglichkeit eine Methode so zu verwenden ?

Danke für eure Antworten.
 
G

Gast

Gast
nee, kannst nur prüfen obs alles ziffern sind

wenn du nur prüfen willst ob da ziffern drin sind und wieviele musst du dir das wohl selber schreiben, was ja nun auch nicht so aufwendig ist
 

Ark

Top Contributor
Code:
// für einen String str

int len=str.length();
int num=0;
char c;
for(int i=0;i<len;i++){
	c=str.charAt(i);
	if(c<='9'&&c>='0') num++;
}

// keine (Deizmal-)Ziffern bei num==0, sonst Anzahl
 

Cyborg

Aktives Mitglied
danke für deine lösung
werd ich gleich mal austesten

ich hatte mir sowas grad gebastelt:

Code:
char zaehler='0';
   
    while(zaehler<=9)
    {
       for(int i=0;i<pW.length();i++)
      {
        if(pW.charAt(i) == zaehler)
        {
         aPasswort = true;
         i=pW.length();
        }  else
        {
         aPasswort = false;
        }
      }
      zaehler++;
    }

aber das Problem, an der Sache ist, dass er den zaehler nicht mit dem charAt(i) vergleichen kann
wenn ich anstatt der variable ne char-zahl eingebe dann macht ers.
woran liegt das ? müssen die mit equals verglichen werden ? ist doch aber kein String oO
 
S

SlaterB

Gast
'0' ist was anderes als 0,

versuch mal
System.out.println("0: "+((int) '0'));

damit dürfte dein while(zaehler<=9) nicht so wirklich funktionieren,
um zwischen Zahlen und Zahlen-chars umzurechen musst du 48 addieren/ subtrahieren,

ansonsten funktioniert
charAt(i) == zaehler ganz gut

String st = "0";
System.out.println("gleich?: " + ('0' == st.charAt(0)));
 

Cyborg

Aktives Mitglied
jetzt bin ich ganz verwirrt :autsch:

also was ich will, ist doch klar oder ?
er soll die die einzelnen chars in nem String auf eine Zahl prüfen.

und das hier irritiert mich

Code:
String text = "1blabla";
    int zaehler=1;
    if(text.charAt(0) == zaehler)
        {
         System.out.println("true");
         } else
         {
           System.out.println("false");
         }
     if(text.charAt(0) == '1')
        {
         System.out.println("true");
         } else
         {
           System.out.println("false");
         }

wieso is das erste false und das untere true ?
er vergleicht doch beides mal die nullte(erste) stelle im String ?
slaterB du hast es sicherlich schon erklärt in deinem Post (?!) aber irgendwie blick ich das immernoch nicht so :-/
 
S

SlaterB

Gast
if(text.charAt(0) == 1)
ist false, denn '1' ist 49

if(text.charAt(0) == 49)
ist true

if(text.charAt(0) == '1')
ist true

if(text.charAt(0) == 1+48)
ist true

ist doch alles klar?
natürlich hast du damit nun ein paar Schwierigkeiten, aber die sollten sich lösen lassen,
evtl. reicht schon
if(text.charAt(0) == zaehler+48)
 

Cyborg

Aktives Mitglied
Ich glaube ich habs geschafft ^^

Ich wette, dass das alles viel einfacher ging und ichs mir wieder viel zu kompliziert gemacht habe.
Aufgabe war es ein Passwort einzulesen welches
- mindestens 8 Zeichen lang ist
- 2 Zeichen Ziffern sein müssen
und das erste Zeichen keine Ziffer sein darf.

hier nochmal mein Code

Code:
boolean aPasswort;
    boolean aPasswort1;
    boolean aPasswort2;
    boolean aPasswort3;
    
// trifft das erste zu ?

    if(pW.length()>=8)
    {
      aPasswort1 = true;
    } else
    {
      aPasswort1 = false;
    }

// trifft das zweite zu ?
    
    int ziffernZaehler = 0;

       for(int i=0;i<pW.length();i++)
      {
        int zaehler=0;
         while(zaehler<=9)
          {
            if(pW.charAt(i) == zaehler+48)
            {
             ziffernZaehler = ziffernZaehler +1;
             zaehler = 10;
            }  else
            {
             aPasswort = false;
            }
            zaehler++;
          }
      }
      if(ziffernZaehler == 2)
      {
       aPasswort2 = true;
      } else
      {
        aPasswort2 = false;
      }
    
// trifft das dritte zu ? 
       
    if(pW.charAt(0) >=48 && pW.charAt(0) <= 58)
    {
      aPasswort3 = false;
    } else
    {
      aPasswort3 = true;
    }
    

    if(aPasswort1 == true && aPasswort2 == true && aPasswort3 == true)
    {
      aPasswort = true;
    } else
    {
      aPasswort = false;
    }

Was von euch jetzt nochmal voll toll wäre ist, wenn mir einer nochmal sagt, wieso das so mit den Chars ist.
ich sitz jetzt schon paar Stunden wieder an der Aufgabe und kann mir das jetzt nimma raussuchen.
Vielleicht hat ja einer von euch nen kurzen Satz dafür (hat doch sicher was mit bits und bytes zu tun ^^)
ansonsten kram ich mir das morgen mal vor.

Auf alle Fälle danke für eure Hilfe !!
 

Ark

Top Contributor
Der Datentyp char repräsentiert ein Unicode-Zeichen. Intern handelt es sich dabei nur um eine 16-Bit breite, vorzeichenlose Ganzzahl (0-65535). Damit ist ein char genauso groß wie ein short, doppelt so groß wie ein byte, halb so groß wie ein int und nur ein Viertel so groß wie ein long.

Da char intern nur eine Zahl ist, kann man entsprechend mit ihr operieren:
Code:
//Beispiel
char c;
c=(char)0; //speichert in c das Unicode-Zeichen mit der Nummer 0, indem der int-Wert rechts auf ein char gecastet wird.
c=0; //wird so nicht funktionieren, da links ein char (16 Bit) erwartet wird, rechts aber ein int-Literal (ein int ist 32 Bit breit) gefunden wird.
c='0'; //speichert in c das Unicode-Zeichen 0 (also die Ziffer 0)
c=(char)48; //speichert in c das Unicode-Zeichen 0 (also die Ziffer 0), indem es die entsprechende Nummer des Zeichens (hier: 48) speichert.
c='\u0000'; //speichert das Zeichen mit der Unicode-Nummer 0. Im Gegensatz zum ersten Beispiel wird hier aber ein char-Literal und kein int-Literal verwendet.
Merk Dir, dass die Nummer des Zeichens etwas anderes ist als das Zeichen selbst. Überall, wo '0' steht, kannst Du dir auch 48 vorstellen. Überall, wo ein 'A' steht, kannst Du dir auch eine 65 vorstellen usw.

MfG
Ark
 

Ark

Top Contributor
Na ja, Dein Code ist auch nicht gerade berauschend.

Beispiel:
a==true ist immer genausoviel Wert wie a selbst. ;)

Hier mal eine verbesserte Version:
Code:
public boolean isPassword(String pW){

	// trifft das erste zu ?
	if(pW.length()<8) return false;// kein Passwort

	// trifft das dritte zu ? (Die Reihenfolge habe ich vertauscht, das macht das Ganze schneller. ;)
	char c=pW.charAt(0);
	if(c<='9' && c>='0') return false;// auch kein Passwort, da erstes Zeichen Ziffer

	// trifft das zweite zu ?
	int ziffernZaehler = 0;
	for(int i=1;i<pW.length();i++){//Zählen beginnt hier bei Index 1, denn im ersten
	// Zeichen kann jetzt keine Ziffer mehr sein, er wäre sonst schon vorher rausgesprungen.
		c=str.charAt(i);
		if(c<='9' && c>='0') ziffernZaehler++;//ist wesentlich besser zu lesen
	}
	return ziffernZaehler == 2;// letzter Schritt, darum kann man das hier so schreiben (Logik ^^)
	// (FRAGE: Sollte man nicht besser prüfen, ob mindestens(!) 2 Ziffern enthalten sind?!?)
}
Keine Garantie, ich habe das nicht einmal durch den Compiler gejagt!

So, jetzt noch mal alles ohne Kommentare, und o wunder, wie einfach das doch ist! :D

Code:
public boolean isPassword(String pW){

	if(pW.length()<8) return false;

	char c=pW.charAt(0);
	if(c<='9' && c>='0') return false;

	int ziffernZaehler = 0;
	for(int i=1;i<pW.length();i++){
		c=str.charAt(i);
		if(c<='9' && c>='0') ziffernZaehler++;
	}
	
	return ziffernZaehler == 2;
}

MfG
Ark

EDIT: Entschuldigt den Doppelpost, aber ich glaube, das war er auch wert.
 

Ark

Top Contributor
Weil das alles andere als einfach ist, so einfach ist das. Ich habe irgendwo gelesen, dass die Regex in Java relativ langsam ausgewertet werden. Jedenfalls musst Du noch die entsprechenden Klassen laden (kostet Speicher und Zeit!) und zig Objekte (darunter mindestens ein String, ein Pattern und ein Matcher!) erstellen. Das dauert alles und braucht auch noch extra RAM; und in der Zeit, in der nur dieser Overhead erledigt ist, wäre so ein kleines Passwort schon lange überprüft. :bae:

Wenn Du so scharf darauf bist, Regex zu verwenden, dann schreib doch mal eine Lösung, ich bin schon gespannt, wie lang die wird. :lol:

Ark
 

Wildcard

Top Contributor
Ark hat gesagt.:
Wenn Du so scharf darauf bist, Regex zu verwenden, dann schreib doch mal eine Lösung, ich bin schon gespannt, wie lang die wird. :lol:
So zum Beispiel:
Code:
    public boolean isPassword(String password)
    {
        int counter = 0;
        Matcher mat = Pattern.compile("\\d").matcher(password.substring(1));
        while(mat.find() && counter <2)
            counter++;
        if(counter>1)
           return  password.matches("([^0-9])\\w{7,}+");
        return false;
    }
Geht mit Sicherheit auch in einem RegEx, aber es ist trotzdem kürzer als deine Lösung :wink:
Der Java-RegEx ist übrigens sehr flott.
 

André Uhres

Top Contributor
Code:
boolean foundMatch = password.matches("\\A[^\\d ](?=[\\S]*[\\d][\\S]*[\\d])\\S{7,}\\z");
 

Ark

Top Contributor
@Wildcard: Meine Methode muss aber keine Objekte anlegen, Deine hingegen erzeugt bei jedem Aufruf Matcher und Strings, zumal Du so schon Strings brauchst, um die Regex' zu formulieren. :bae:

Jetzt noch kürzer:
Code:
public final boolean isPassword(final String pW){
	char c;
	final int l=pW.length();
	if(l<8||((c=pW.charAt(0))<='9'&&c>='0')) return false;
	int z=0;
	for(int i=1;i<l;i++) if((c=str.charAt(i))<='9'&&c>='0') z++;
	return z==2;
}

@André Uhres: Angeber. :cool:

Hey, ich find' das irgendwie lustig, der Thread könnte glatt ins Performance-Forum verschoben werden. xD

Wir sollten mal alle Vorschläge durch Profiler jagen und auf Herz und Nieren (d. h. Speicher- und Zeitverbrauch) prüfen …

Passwörter zum Test (jeweils 5000000 mal durchprobieren):
a
a2
2a
abcdefg
abcdefg2
2abcdefg
22abcde
22abcdef
2abcdef2
abcdef22
abcdefghijklmnopqrstuvwxyzab
22abcdefghijklmnopqrstuvwxyz
2abcdefghijklmnopqrstuvwxyz2
abcdefghijklmnopqrstuvwxyz22


:wink:
Ark
 

Wildcard

Top Contributor
1. Regel zur Performanceopitmierung:
Don't
Lesbarkeit ist einfach wichtiger. Optimiert wird erst wenn es wirklich notwendig ist und auch nur an denen Stellen die wirklich ins Gewicht fallen.
@André
nice :cool:
 

Cyborg

Aktives Mitglied
tolle Lösungen die ihr da habt ^^
nur kann ich die leider "noch" nicht verwenden.
Meine Aufgabe war es ja, die Lösung so hinzubasteln, dass wir das gelernte anwenden sollen ^^

sprich evtl. Methoden aus der String.Klasse oder was von der Wrapper Klasse

und ich glaube mal, das Ziel hab ich doch erfüllt oder ?
sicherlich gibts kürzere und performance armere Varianten, aber das war ja nicht MEINE Aufgabe
und ihr sollt ja auch nicht meine Hausaufgaben machen :)

Aber trotzdem danke für die tollen Lösungen, werd ich mir alle mal anguckn ;)

*edit*

@ Ark: :applaus:
zu deiner Frage: Hatte nochmal nachgeschaut und Ja, es müssen 2 Ziffern drin sein. Also nicht MINDESTEN ;)
ist zwar wie du richtig erkannt hast, ne komische Logik, aber ok :)
 

Ark

Top Contributor
@Cyborg: Bitteschön. :)

Aber nimm ja nicht diese wahnsinnig zusammengedrückte Variante von mir, da habe selbst ich Schwierigkeiten durchzublicken. :lol:

Die folgende Version sollte alle zufriedenstellen, inklusive Kommentare auch die Lehrer. ;)
Code:
public boolean isPassword(String pW){

	if(pW.length()<8) return false;// Länge stimmt nicht

	char c = pW.charAt(0);
	if(c<='9' && c>='0') return false;// erstes Zeichen ist Ziffer

	int ziffern = 0;// Anzahl der Ziffern
	// Beginn der Schleife bei Index 1,
	// da erstes Zeichen bereits überprüft
	for(int i=1;i<pW.length();i++){
		c = str.charAt(i);
		if(c<='9' && c>='0') ziffern++;// Ziffern zählen
	}
	return ziffern == 2;
	// true, wenn auch die letzte Bedingung
	// erfüllt ist, sonst false
}
Na ja, aber gerade die return-Anweisungen (gerade die letzte!) zeugen doch von ziemlich viel Erfahrung, so schreiben Programmieranfänger normalerweise nicht. Das könnte dem Lehrer verdächtig vorkommen … ;)

noch mal@André Uhres: nice ja, und schwer zu lesen ebenfalls. :roll: Wie war das doch gleich mit der Performanceoptimierung … ;)

MfG
Ark
 

Cyborg

Aktives Mitglied
Ark hat gesagt.:
Na ja, aber gerade die return-Anweisungen (gerade die letzte!) zeugen doch von ziemlich viel Erfahrung, so schreiben Programmieranfänger normalerweise nicht. Das könnte dem Lehrer verdächtig vorkommen … ;)

Da könntest du recht haben, hätte dieses Problem jedoch mit nem einfach if gelöst :)
Aber Aufgabe musste nicht abgegeben werden oder so, die sollte uns einfach nur auf die Klausur vorbereiten :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
F wie kann ich die Position des letzten Vokals innerhalb einer Zeichenkette ermitteln? Java Basics - Anfänger-Themen 5
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
nonickatall Input/Output Zeichenkette in Array zerlegen Java Basics - Anfänger-Themen 2
M Erste Schritte Zeichenkette zerlegen Java Basics - Anfänger-Themen 5
V Zeichenkette programmieren Java Basics - Anfänger-Themen 20
H Methoden Zeichenkette Java Basics - Anfänger-Themen 4
P Zeichenkette Zeichen ausschlißen funktioniert nicht richtig Java Basics - Anfänger-Themen 9
M Zeichenkette konvertieren Java Basics - Anfänger-Themen 1
B Array Zeichenkette umkehren Java Basics - Anfänger-Themen 6
P Zeichenkette mit Binärzahl in Dezimalzahl umrechnen Java Basics - Anfänger-Themen 3
L Zeichenkette zerlegen Java Basics - Anfänger-Themen 4
H Wie wandel ich ein Datum in eine Zeichenkette um mit StringBuffer? Java Basics - Anfänger-Themen 3
X Methoden Bei Arrayausgabe wird eine nichtdefinierte Zeichenkette/Anhängsel ausgegeben Java Basics - Anfänger-Themen 7
G Erste Schritte Suche nach Zeichenkette Java Basics - Anfänger-Themen 26
M Methoden String methoden ,Häufigkeit einm wort in der Zeichenkette Java Basics - Anfänger-Themen 14
S "über Parameter soll zeichenkette übergeben werde" Java Basics - Anfänger-Themen 48
P Textdatei auf erste Zeichenkette Prüfen... Java Basics - Anfänger-Themen 10
B zeichenkette in ganze zahlen Java Basics - Anfänger-Themen 2
A UserInput (Eingabe in Form einer Zeichenkette) Java Basics - Anfänger-Themen 11
B Zeichenkette? Java Basics - Anfänger-Themen 7
C Variable Zeichenkette innerhalb einer Schleife ersetzen Java Basics - Anfänger-Themen 4
T Zeichenkette generieren lassen Java Basics - Anfänger-Themen 6
G Zeichenkette in char-Array konvertieren Java Basics - Anfänger-Themen 13
G Zeichenkette suchen in Vector-Klasse Java Basics - Anfänger-Themen 11
D Zeichenkette in String löschen Java Basics - Anfänger-Themen 4
T charAt funktion mit einer string zeichenkette nutzen. WIE? Java Basics - Anfänger-Themen 13
B Bestimmte Zeichenkette aus String herausschneiden? Java Basics - Anfänger-Themen 8
E Zeichenkette Java Basics - Anfänger-Themen 14
G Zeichenkette anhand einer anderen Zeichenkette trennen Java Basics - Anfänger-Themen 6
J Zahlen aus Zeichenkette rausparsen? Java Basics - Anfänger-Themen 4
S Zeichenkette zerlegen? Java Basics - Anfänger-Themen 4
F Problem mit Zeichenkette nur aus Leerzeichen Java Basics - Anfänger-Themen 4
E Zeichenkette einlesen Java Basics - Anfänger-Themen 2
N geschachtelte ausgabe einer zeichenkette Java Basics - Anfänger-Themen 5
G Eingabe einer Zeichenkette ? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben