2016-11-21 121 views
1

我一直在寻找一个答案,但我没有找到一个可以帮助我的人(有人可能知道在哪里指向我)。Java:将字符串拆分为单独的字符串和整数变量

我想将一个字符串分成一个字符串变量和两个整数变量。我想知道是否有用户使用我发现的字符串拆分方法,并通过其他方式将它用于int变量?

代码:

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

输出示例:

Month: Jan 
Date: 12 
Year: 1992 
+2

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

+0

最简单的方法将是问用户分别输入日,月和年(3次调用扫描器)并分别验证每一个。 – alfasin

回答

4

根据您的意见,和代码使用Scanner。我想你想

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

但是,如果不需要你的任务的Scanner,那么你肯定能消除它,并使用类似

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

因此,使用下一个方法将遵循并跳过我声明的任何值? – Aramza

+0

@Aramza我不确定你在问什么,你有'inSS = new Scanner(userInput);'这意味着你的'Scanner'正在读你预定义的'String'。 'next()'读取'String'(Jan),'nextInt'读取12,第三个'nextInt'读取1992.在第二个版本中,我跳过'Scanner'并使用'String.split'。 –

-1

好像你正在处理的日期字符串,更好地使用特定的库。

的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 

的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 

或者使用JodaTime

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

这个答案只适用于安装Java版本是1.8+。@LukeLee –

+0

每年的月份仍然是一个字符串 –

+0

OP正在处理日期时间,让我们不要复杂的问题和**不**使用适当的日期时间库。 –

0

我不希望使用一个用来打破坚果的大锤:-)但根据您在应用程序中所需的灵活性,您可以针对您的问题使用解析器。如果你把下面的语法写入ANTLR,你可以解析输入字符串并从中提取语义元素。您甚至可以处理不同的输入排列,例如Jan 1999 12,1999 Mar 12等。

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; 

让我们假设一个用户提供输入jan 1999 12。使用Antlr从上面的语法生成的解析器解析它之后,您将得到下面的解析树,从中可以轻松提取语义元素,根据这些语义元素可以推断出数据类型并创建适当的对象(例如,年份和日期的int ,以及月份的字符串)。

enter image description here