我希望至少有一个善良的人愿意帮助我 - 这个话题会让我很沮丧。
我有一个问题是从控制台读取特定组成的数据,这意味着:在第一行中我有三个符号由空格分隔 - 2位数字和1个字符。第二行有String行。例如:
1 2 E
WHUNDDLOOD
5 7 S
LRRMSDDD
我需要将它们作为字节类型(前两位数),字符(第一行中的最后一个符号)和一个字符串(整个第二行)。
我尝试使用Scanner,但无法从中读取字符。但是我尝试使用" charAt()"但是......可能我已经厌倦了。
我的代码摘录:
while (stdin.hasNextLine()) {
Scanner stdin = new Scanner(System.in);
byte x = stdin.nextByte();
byte y = stdin.nextByte();
char h = stdin.next().charAt(0);
String str = stdin.nextLine();
}
我得到了InputMismatchException,甚至没有读取最后一个字符串。你能救我吗?
答案 0 :(得分:2)
关闭,但您需要在.next()
之后清除该行。如果不这样做,你的循环读取直到行的结尾,然后回到它预期一个字节的循环顶部。你给它一个字符串,因此抛出一个InputMismatchException
。
Scanner stdin = new Scanner(System.in);
do {
byte x = stdin.nextByte();
byte y = stdin.nextByte();
char h = stdin.next().charAt(0);
stdin.nextLine(); // read EOL
String str = stdin.nextLine();
System.out.printf("Output: [%s, %s, %s], %s\n", x, y, h, str);
} while (stdin.hasNextLine());
生成强>
1 2 E
WHUNDDLOOD
Output: [1, 2, E], WHUNDDLOOD
5 7 S
LRRMSDDD
Output: [5, 7, S], LRRMSDDD
答案 1 :(得分:1)
解析这样的数据的最佳方法是不使用Scanner
,而是自己处理这些行。为此,正则表达式将使它变得更容易。
Pattern row1pattern = Pattern.compile("([0-9])\\s+([0-9])\\s+([a-zA-Z])");
for (;;) {
String line1 = (stdin.hasNextLine() ? stdin.nextLine() : "").trim();
if (line1.isEmpty())
break;
String line2 = (stdin.hasNextLine() ? stdin.nextLine() : "").trim();
Matcher m = row1pattern.matcher(line1);
if (! m.matches() || line2.isEmpty()) {
System.out.println("Bad input. Goodbye.");
break;
}
byte digit1 = (byte)(m.group(1).charAt(0) - '0');
byte digit2 = (byte)(m.group(2).charAt(0) - '0');
char char1 = m.group(3).charAt(0);
// now use digit1, digit2, char1, and line2, e.g.
System.out.println(digit1 + ", " + digit2 + ", " + char1 + ", " + line2);
}
<强>输出强>
1, 2, E, WHUNDDLOOD
5, 7, S, LRRMSDDD