Сканер использует разделитель, но не распознает целое число после него - PullRequest
0 голосов
/ 03 декабря 2018

Кажется, я не могу найти проблему в своем коде, и мне было интересно, если вы, замечательные люди, захотите мне помочь.Мой профессор требует, чтобы мы создали двумерный массив из информации, взятой из файла, который она нам предоставила.Используя класс Scanner и File, мы сможем добиться этого, однако я столкнулся с проблемой ускорения.Мой сканер не распознает целое число после разделителя, который я для него установил.Вот файл, который она нам предоставляет.

5x7
o,2,3
7,1,3
7,1,1
X,4,2

Эта информация отделена переводами строк, где в цитате есть пробелы.

Вот мой код:

import java.io.*;
import java.util.*;
public class Battlefield {

// Use the FILL_CHAR for a space that contains no creature.
// Use these chars for creatures so that your code will pass
// the tests used for evaluating your program.
public final char FILL_CHAR = '-';
public final char OGRE      = 'o';
public final char CENTAUR   = '7';
public final char DRAGON    = 'X';

private char[][] field;

public Battlefield(String fn) {
    try {
    // You write code here.
    // Read a file and initialize the field.
    // The name of the file is passed in from the driver.
    // Keep all the file reading stuff in the try/catch block
    // to make file exceptions easier to deal with.
    File battlefield = new File(fn);
    Scanner scan = new Scanner(battlefield);
    scan.useDelimiter("x");
    int row = scan.nextInt();
    System.out.println(row);
    System.out.println(scan.next());
    System.out.println(scan.hasNextInt());
    int column = scan.nextInt();
    char[][] field = new char[row][column];

    /**
    Scanner scan2 = new Scanner(battlefield);
    scan2.useDelimiter(",");
    /**
    field[scan2.nextInt()][scan2.nextInt()] = OGRE;
    field[scan2.nextInt()][scan2.nextInt()] = CENTAUR;
    field[scan2.nextInt()][scan2.nextInt()] = CENTAUR;
    field[scan2.nextInt()][scan2.nextInt()] = DRAGON;
    **/
    } catch (IOException ex) {
        System.err.println(ex.getStackTrace());
    }
}

И мой основной метод / класс драйвера:

public class BattlefieldDrv {
public static void main(String[] args)
{
    Battlefield battlefieldOne = new Battlefield("1field.dat");
    System.out.println(battlefieldOne.toString());
}
}

Вот мой след стека:

> 5
  7
  o,2,3
  7,1,3
  7,1,1
  X,4,2
false
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Unknown Source)
    at java.base/java.util.Scanner.next(Unknown Source)
    at java.base/java.util.Scanner.nextInt(Unknown Source)
    at java.base/java.util.Scanner.nextInt(Unknown Source)
    at Battlefield.<init>(Battlefield.java:38)
    at BattlefieldDrv.main(BattlefieldDrv.java:15)

Спасибо за любую помощь или понимание, что у вас есть!

1 Ответ

0 голосов
/ 04 декабря 2018

Итак, давайте пройдемся по этому коду.

scan.useDelimiter("x");
int row = scan.nextInt();

5 считывается в row.

System.out.println(row);

5 печатается.

System.out.println(scan.next());

остальная часть файла читается и печатается, потому что это то, что следует после x.

System.out.println(scan.hasNextInt());

Больше нечего читать, поэтому здесь выбрасывается NoSuchElementException.

Необходимо, чтобы сканер также принимал символы новой строки в качестве разделителя;Вы можете сделать это, используя

scan.useDelimiter("(x|\\s)");

(\\s - это шаблон для "любого пробела").

В качестве примечания, рекомендуется использовать try-with-resources-construct:

try (Scanner scan = new Scanner(Paths.get("1field.dat"))) {
    scan.useDelimiter(...);
    ...
} catch (IOException e) {

Это приведет к автоматическому закрытию вашего файлового ресурса.

...