useDelimiter / Muster im Parameter (Pattern)

oo

Neues Mitglied
Hallo zusammen,

das unterstehende Programm soll aus z.B. folgender Eingabe "12.01.2010" (Konsoleneingabe) den Tag, Monat und Jahr auslesen können.

Java:
import java.util.*;

public class Delimiter
{
    public static void main (String args[])
    {
        int tag = 0, monat = 0, jahr = 0;   
        System.out.println("Bitte geben Sie den Termin (tt.MM.YYYY)ein");
        
        Scanner sc1 = new Scanner(System.in).useDelimiter("[.\n]"); // Punkt oder neue Zeile als Trenner

        if (sc1.hasNextInt())
        {    
            System.out.println("erstes hasNext == true");
            tag = sc1.nextInt();
        }
        if (sc1.hasNextInt())
        {
             System.out.println("zweites hasNext == true");
             monat = sc1.nextInt(); //12.12
        }
        if (sc1.hasNextInt())
        {
            System.out.println("drittes hasNext == true");
            jahr = sc1.nextInt();  
        }
               
        System.out.println("Ihre Eingabe: " + tag + "." + monat + "." + jahr);
    }
}
Das klappt soweit auch. Wenn ich über die Konsole jedoch folgendes eingebe "12.11" bleibt das Programm hängen (bzw. der Scanner springt in die nächste Zeile und wartet auf eine weitere Eingabe. Die Ausgabe sieht wie folgt aus:

Bitte geben Sie den Termin (tt.MM.YYYY) ein
12.11
erstes hasNext == true
zweites hasNext == true


Erst wenn ich in der nächsten Zeile die Eingabe mit einem Return beende, wird auch das Programm beendet und die Parameter wie gewünscht ausgegeben. Die Ausgabe sieht dann wie folgt aus:


Ihre Eingabe: 12.11.0



Wieso passiert das? Als newDelimiter Parameter habe ich [.\n] übergeben. Nach meinem Verständnis trennt der Delimiter die Zahlen bei einem Punkt oder am Ende einer Zeile (also wenn ich meine Eingabe mit Return beendet habe). Entsprechend müsste er bei der Eingabe "12.12\n" die beiden Zahlen trennen können und das Programm beenden (oder?).

Ich wäre euch sehr dankbar wenn ihr mir bei diesem Problem weiterhelft. Ich würde gerne verstehen wieso sich das Programm so verhält und was ich tun muss, damit das Programm bei der Eingabe von "12.12" automatisch beendet wird und die Parameter wie folgt belegt sind (tag = 12, monat = 12, Jahr = 0).

Im voraus VIELEN DANK!!!

Christian
 

nrg

Top Contributor
Java:
        int tag = 0, monat = 0, jahr = 0;   
        System.out.println("Bitte geben Sie den Termin (tt.MM.YYYY)ein");
        Scanner sc1 = new Scanner(System.in);  
        sc1 = new Scanner(sc1.next()).useDelimiter("\\.");
        if ( sc1.hasNextInt() )
        	tag = sc1.nextInt();
        if ( sc1.hasNextInt() )
        	monat = sc1.nextInt();
        if ( sc1.hasNextInt() )
        	jahr = sc1.nextInt(); 
        sc1.close();
        System.out.println("Ihre Eingabe: " + tag + "." + monat + "." + jahr);

Unschön finde ich die zwei Scannerinstanzen aber was besseres fällt mir grad net ein (wenn du es nur mit Scanner machen willst)
also ich vermute (arbeite nie mit Scanner und noch seltener zum Tokenizer), dass jeder .nextX bzw .hasNextX die source abfragt. Wenn das ein String ist iteriert er damit einfach weiter durch den String. Bei System.in fragt er halt nochmal nach einer Benutzereingabe. Deshalb musst du das neu Instanziieren (hab in der API keine Möglichkeit die source nachträgtlich zu ändern)

Wenn ich dabei falsch liege, lasse ich mich gern eines besseren belehren. Wie gesagt, ist nur eine Vermutung
 

JanHH

Top Contributor
Meine Güte. Seid ihr nicht in der Lage, einen String ganz simpel nach Punkten getrennt zu zerlegen, ohne gleich schwere Scanner-Geschütze aufzufahren?
 

agentone

Bekanntes Mitglied
Also du kannst auch den java.util.StringTokenizer nehmen.
StringTokenizer (Java 2 Platform SE v1.4.2)
Java:
StringTokenizer st=new StringTokenizer(eingabe,".");
und noch seltener zum Tokenizer
Aber nrg scheint den nicht so toll zu finden. (Warum, wenn ich fragen darf?)
Aber ich lese gerade diesen Satz in der API:
StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.

Oder aber du nimmst die String-Methoden indexOf und substring, geht genauso gut.

Mit Regex lässt sich also bestimmt auch was machen.
 

agentone

Bekanntes Mitglied
Also jetzt mal ein Beispiel für String#split():

Java:
public class RegexTest
{
  public static void main(String args[])
  {
    System.out.println("Hex von '.': "+Integer.toHexString('.'));// -> der '.' hat einen Ascii-Code von 46 und 46 hat die Hex-Darstellung 2E (siehe weiter unten)

    String eingabe="12.03.2010";
    
    String[] array=eingabe.split("\\x2E");
    
    System.out.println("string: "+eingabe);
    System.out.println("length: "+array.length);
    for(String s:array)
    {
      System.out.println("'"+s+"'");
    }
  }
}

Du musst es nur noch so umschreiben, dass anhand der Länge des Arrays einmal das Jahr eingelesen wird und einmal der Standardwert 0 verwendet wird.
 

nrg

Top Contributor
Aber nrg scheint den nicht so toll zu finden. (Warum, wenn ich fragen darf?)

habe ich in meinen Post oben irgendwas vom StringTokenizer gesagt? Ich hab nur gesagt, dass ich den Scanner dafür idR nicht verwende, sondern eben String.split, StringTokenizer od selber schreiben. StringTokenizer zum zurückgeben der Delims und zum direkten iterieren durch die Tokens. String.split um einfach ein Array zu bekommen.

Ich habe es halt oben mit dem Scanner probiert, weil der TO genau das wissen wollte.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
E useDelimiter-Anwednung / Regex Java Basics - Anfänger-Themen 2
F Frage zum Scanner.useDelimiter Java Basics - Anfänger-Themen 3
M immer noch usedelimiter Java Basics - Anfänger-Themen 4
M Sonderzeichen beim usedelimiter Java Basics - Anfänger-Themen 4
E Durch Muster in Array iterieren Java Basics - Anfänger-Themen 3
B Dekorator Muster - Irgendwas stimmt hier doch nicht? Java Basics - Anfänger-Themen 4
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
1 Wie dieses Muster am einfachsten erkennen? Java Basics - Anfänger-Themen 32
H Muster mit verschachtelten Schleifen kreieren. Java Basics - Anfänger-Themen 2
Yasemin bahar Muster erkennen Java Basics - Anfänger-Themen 13
C Erste Schritte Muster ausgeben in der Konsole - großes V Java Basics - Anfänger-Themen 5
U Muster in einem Array erkennen Java Basics - Anfänger-Themen 8
F Quadrat Mit Muster Java Basics - Anfänger-Themen 15
J Muster und Schleifen Java Basics - Anfänger-Themen 33
R 2D Arrays mit vorgegebenem Muster Java Basics - Anfänger-Themen 2
E Arrays nach best Muster füllen Java Basics - Anfänger-Themen 4
K String nach bestimmtem Muster parsen Java Basics - Anfänger-Themen 3
P Sägezahn Muster Programm Java Basics - Anfänger-Themen 2
C Array Muster erzeugen Java Basics - Anfänger-Themen 2
J Erste Schritte zweidimensionales Array Muster befüllen. Java Basics - Anfänger-Themen 4
J Strukturierung mit MVC Muster Java Basics - Anfänger-Themen 20
J Array Muster mit true und false Java Basics - Anfänger-Themen 6
C Muster programmieren Java Basics - Anfänger-Themen 4
C Muster programmieren Java Basics - Anfänger-Themen 4
E Muster auf der Konsole ausgeben lassen (Schleifen) Java Basics - Anfänger-Themen 7
arti28 Erste Schritte For-Schleifen und While-Schleifen, String als Muster ausgeben. Java Basics - Anfänger-Themen 3
L Java Muster Java Basics - Anfänger-Themen 1
Todesbote String auf Muster überprüfen Java Basics - Anfänger-Themen 19
C Array Zickzack Muster Java Basics - Anfänger-Themen 3
P RegEx Muster mehrfach treffen Java Basics - Anfänger-Themen 2
M Muster erkennen. Idee: Fassade. Java Basics - Anfänger-Themen 3
Dit_ Regex | Muster {a}{b}{c} Java Basics - Anfänger-Themen 7
pindakaas Compiler geht nicht (Dekorator Muster) Java Basics - Anfänger-Themen 18
M Datentypen Strings nach Muster auslesen und verarbeiten Java Basics - Anfänger-Themen 5
S X Zeichnen als Muster ausgeben Java Basics - Anfänger-Themen 5
R Muster ausgeben Java Basics - Anfänger-Themen 4
H Muster ausgeben Java Basics - Anfänger-Themen 25
G String auf Muster prüfen Java Basics - Anfänger-Themen 5
S OOP Warum gleiche Instanz der Klasse? (Factory-Muster) Java Basics - Anfänger-Themen 13
L Sägezahn Muster Java Basics - Anfänger-Themen 4
C Muster mit Zweidimensionalen Arrays Java Basics - Anfänger-Themen 18
0 Applet mit folgendem Muster erstellen Java Basics - Anfänger-Themen 12
P Fragen zum Observer Muster und Datenbanken Java Basics - Anfänger-Themen 2
Z Muster Java Basics - Anfänger-Themen 9
J nach Muster in String suchen Java Basics - Anfänger-Themen 4
C Interface Parameter und Rückgabewerte in Lambda Ausdrücken verwenden Java Basics - Anfänger-Themen 16
C Parameter in verschiedenen Anzahl und Typen Java Basics - Anfänger-Themen 6
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
BeginnerJava "Weihnachtsbäume" anzeigen: Höhe als Parameter Java Basics - Anfänger-Themen 1
R Methoden Werte einer ArrayList als Parameter übergeben. Java Basics - Anfänger-Themen 4
I Optionaler Parameter bei Methode, der nur optional ist? Java Basics - Anfänger-Themen 6
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
R Eigenschaft über Parameter auslesen und ändern Java Basics - Anfänger-Themen 15
P Eclipse Karate Framework API Test . Unexpected Error: the trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 1
X Default Parameter Java Basics - Anfänger-Themen 20
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
J Bestimmte parameter aus Jsonfile auslesen Java Basics - Anfänger-Themen 15
I JAX-RS Mehrere Parameter in Query Java Basics - Anfänger-Themen 3
H Warum kann man keine Parameter in die main-Methode packen? Java Basics - Anfänger-Themen 4
B Konstruktor mit Array als Parameter Java Basics - Anfänger-Themen 3
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
L Wie greife ich in der Subklasse auf die Parameter einer Methode der Superklasse zu ? Java Basics - Anfänger-Themen 15
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
J Apache Poi - createCell() Methode akzeptiert keinen Index aus for-schleife als Parameter Java Basics - Anfänger-Themen 4
P Parameter auf Datenformat überprüfen Java Basics - Anfänger-Themen 5
S Hamster Simulator rechnen lernen Parameter int Java Basics - Anfänger-Themen 6
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
C Java Methoden "Parameter" Problem Java Basics - Anfänger-Themen 16
W Parameter solange addieren bis 13 auftaucht Java Basics - Anfänger-Themen 11
L OOP Parameter mit der Draw-Methode übergeben Java Basics - Anfänger-Themen 11
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
L Methoden Übergabe von Parameter Java Basics - Anfänger-Themen 3
R Zu viele leere Parameter Java Basics - Anfänger-Themen 8
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 3
B Klassen Array Parameter im Konstruktor? Java Basics - Anfänger-Themen 4
V Unbekannte Parameter Java Basics - Anfänger-Themen 1
J Input/Output Input als Parameter an Methoden übergeben Java Basics - Anfänger-Themen 23
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
U Mehrfacheingabe auf bestimmte Parameter prüfen Java Basics - Anfänger-Themen 8
A festgelegte Parameter Java Basics - Anfänger-Themen 11
PaperHat Methoden als Parameter anderer Methode verwenden Java Basics - Anfänger-Themen 11
D Interface Final für Parameter in überschriebenen Methoden? Java Basics - Anfänger-Themen 3
P Variablen Optionaler Parameter auf der Kommandozeile Java Basics - Anfänger-Themen 12
S Variable Parameter Java Basics - Anfänger-Themen 5
L Variablen Parameter bekommen Java Basics - Anfänger-Themen 13
M Methode mit Array als Parameter an Main übergeben Java Basics - Anfänger-Themen 1
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
B Webservice -> alle parameter bekommen von form Java Basics - Anfänger-Themen 2
K Klassenmethode mit übergebenen Parameter speichern Java Basics - Anfänger-Themen 7
I BigDecimal als Parameter verwenden Java Basics - Anfänger-Themen 3
J Parameter in main verwenden Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben