从控制台读取字符,字节和字符串

时间:2016-02-11 20:56:52

标签: java java.util.scanner

我希望至少有一个善良的人愿意帮助我 - 这个话题会让我很沮丧。

我有一个问题是从控制台读取特定组成的数据,这意味着:在第一行中我有三个符号由空格分隔 - 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,甚至没有读取最后一个字符串。你能救我吗?

2 个答案:

答案 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