2016-11-21 3 views
1

Ich habe nach einer Antwort gesucht, aber ich hatte kein Glück, einen zu finden, der mir recht helfen kann (jemand kann wissen, wo er mich hinweist).Java: Zerlege einen String in separate String- und Integervariablen

Ich möchte eine Zeichenfolge in eine String-Variable und zwei Integer-Variablen aufteilen. Ich wundere mich, wenn es irgendwie gibt, um die String-Split-Methode, die ich entdeckt habe, zu verwenden und sie für int-Variablen auf andere Weise zu benutzen?

Code:

import java.util.Scanner; 

public class StringInputStream { 
    public static void main (String [] args) { 
     Scanner inSS = null; 
     String userInput = "Jan 12 1992"; 
     inSS = new Scanner(userInput); 

     String userMonth = ""; 
     int userDate = 0; 
     int userYear = 0; 

     // Can modify anything below here 
     String[] temp = userInput.split(" ", 2); // "1" means stop splitting after one space 
     userMonth = temp[0]; 
     userDate = temp[1]; 
     userYear = temp[2]; 
     // Can modify anything above here 

     System.out.println("Month: " + userMonth); 
     System.out.println("Date: " + userDate); 
     System.out.println("Year: " + userYear); 

     return; 
    } 
} 

Beispiel Ausgabe:

Month: Jan 
Date: 12 
Year: 1992 
+2

siehe https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String) –

+0

einfachste Weg wird zu fragen, Der Benutzer kann den Tag, den Monat und das Jahr getrennt eingeben (3 Aufrufe an den Scanner) und diese einzeln überprüfen. – alfasin

Antwort

4

Basierend auf Ihre Kommentare und Code ein Scanner verwenden. Ich glaube, Sie

userMonth = inSS.next(); 
userDate = inSS.nextInt(); 
userYear = inSS.nextInt(); 

wollte Aber wenn die Scanner nicht für Ihre Zuordnung erforderlich ist, dann könnte man es auf jeden Fall und so etwas wie

String userInput = "Jan 12 1992"; 
String[] tokens = userInput.split("\\s+"); // <-- split on one or more spaces 
String userMonth = tokens[0]; 
int userDate = Integer.parseInt(tokens[1]); 
int userYear = Integer.parseInt(tokens[2]); 
+0

Also die Verwendung der nächsten Methode wird folgen und überspringen, was auch immer ich deklariere? – Aramza

+0

@Aramza Ich bin mir nicht sicher, was Sie fragen, Sie haben 'inSS = neuer Scanner (userInput);' was bedeutet, dass Ihr 'Scanner' Ihren vordefinierten' String' liest. Das 'next()' liest einen 'String' (Jan), der' nextInt' liest 12 und der dritte 'nextInt' liest 1992. In der zweiten Version überspringe ich den' Scanner' und benutze 'String.split'. –

-1

verwenden beseitigen Scheint, wie Sie mit Datum Strings zu tun haben, besser die spezifische Bibliothek verwenden.

Java 8

import java.time.format.DateTimeFormatter; 
import java.time.temporal.*; 

TemporalAccessor d = DateTimeFormatter.ofPattern("MMM DD yyyy").parse("Jan 12 1992") 
d.get(ChronoField.YEAR); // 1992 
d.get(ChronoField.MONTH_OF_YEAR); // 1 
d.get(ChronoField.DAY_OF_MONTH); // 12 

Vor Java 8 (java.text.SimpleDateFormat)

Date d = new SimpleDateFormat("MMM DD yyyy").parse("Jan 12 1992"); 
Calendar c = Calendar.getInstance(); 
c.setTime(d); 
c.get(Calendar.YEAR); // 1992 
c.get(Calendar.MONTH); // 0 - yeah, it starts from 0, embarrassingly 
c.get(Calendar.DAY_OF_MONTH); // 12 

Oder verwenden JodaTime

DateTimeFormat.forPattern("MMM DD yyyy").parseDateTime("Jan 12 1992"); 
+0

Diese Antwort wird nur angewendet, wenn die installierte Java-Version 1.8+ [email protected] –

+0

Monat des Jahres ist immer noch erforderlich, um eine Zeichenfolge zu sein –

+0

OP behandelt mit Datum mal, lassen Sie uns das Problem nicht komplizieren und ** nicht ** verwenden Sie eine ordnungsgemäße Datum Zeit Bibliothek. –

0

Ich will nicht verwenden, ein Vorschlaghammer, um eine Nuss zu knacken :-) aber abhängig von der Flexibilität, die Sie in Ihrer Anwendung in Bezug auf die Eingabe benötigen, können Sie einen Parser für Ihr Problem verwenden. Wenn Sie die folgende Grammatik verwenden und sie in ANTLR einfügen, könnten Sie die Eingabezeichenfolge analysieren und die semantischen Elemente daraus extrahieren. Sie könnten sogar verschiedene Eingabe-Permutationen wie Jan 1999 12, 1999 Mar 12 und so weiter behandeln.

grammar SimpleMixed; 
fragment A:('a'|'A'); 
fragment B:('b'|'B'); 
fragment C:('c'|'C'); 
fragment D:('d'|'D'); 
fragment E:('e'|'E'); 
fragment F:('f'|'F'); 
fragment G:('g'|'G'); 
fragment H:('h'|'H'); 
fragment I:('i'|'I'); 
fragment J:('j'|'J'); 
fragment K:('k'|'K'); 
fragment L:('l'|'L'); 
fragment M:('m'|'M'); 
fragment N:('n'|'N'); 
fragment O:('o'|'O'); 
fragment P:('p'|'P'); 
fragment Q:('q'|'Q'); 
fragment R:('r'|'R'); 
fragment S:('s'|'S'); 
fragment T:('t'|'T'); 
fragment U:('u'|'U'); 
fragment V:('v'|'V'); 
fragment W:('w'|'W'); 
fragment X:('x'|'X'); 
fragment Y:('y'|'Y'); 
fragment Z:('z'|'Z'); 

s: userinput EOF; 
userinput: month date year 
    | month year date 
    | year month date 
    | year date month 
    | date year month 
    | date month year; 

month: Month; 
date: Date; 
year: Year; 
Month: J A N | F E B | M A R | A P R | M A Y | J U N | J U L | A U G | S E P  | 
O C T | N O V | D E C; 

Date: [1-9][0-2]?; 

Year: [1-9][0-9][0-9][0-9]; 


WS : [ \t\r\n]+ -> skip; 

Lasst uns ein Benutzer bietet jan 1999 12 Eingabe annehmen. Nach dem Parsen mit dem von Antlr aus der obigen Grammatik generierten Parser erhalten Sie den Parsebaum darunter, aus dem Sie leicht die semantischen Elemente extrahieren können, auf deren Basis Sie den Datentyp ableiten und die entsprechenden Objekte erstellen können (zB int für Jahr und Datum) und String für Monat).

enter image description here