Java:将字符串拆分为单独的字符串和整数变量
我一直在寻找一个答案,但我没有找到一个可以帮助我的人(有人可能知道在哪里指向我)。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
根据您的意见,和代码使用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]);
因此,使用下一个方法将遵循并跳过我声明的任何值? – Aramza
@Aramza我不确定你在问什么,你有'inSS = new Scanner(userInput);'这意味着你的'Scanner'正在读你预定义的'String'。 'next()'读取'String'(Jan),'nextInt'读取12,第三个'nextInt'读取1992.在第二个版本中,我跳过'Scanner'并使用'String.split'。 –
好像你正在处理的日期字符串,更好地使用特定的库。
的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");
这个答案只适用于安装Java版本是1.8+。@LukeLee –
每年的月份仍然是一个字符串 –
OP正在处理日期时间,让我们不要复杂的问题和**不**使用适当的日期时间库。 –
我不希望使用一个用来打破坚果的大锤:-)但根据您在应用程序中所需的灵活性,您可以针对您的问题使用解析器。如果你把下面的语法写入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 ,以及月份的字符串)。
看到https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String) –
最简单的方法将是问用户分别输入日,月和年(3次调用扫描器)并分别验证每一个。 – alfasin