Сканер Java очищается несмотря ни на что, как это предотвратить? - PullRequest
0 голосов
/ 11 февраля 2019

Я изучаю Java и создаю библиотеку.Я хочу использовать три метода на одном и том же Сканере, но сканер очищается каждый раз.

Мы используем Jcreator в классе, и мой учитель не смог выяснить, что происходит.Единственное, что работает, это

public static void main(String[] args)
{
    Scanner kb = new Scanner(System.in);
    String typedStuff = kb.nextLine();
    Scanner chopper = new Scanner(typedStuff);

    System.out.println(howMany(chopper));
    System.out.println(howManyInts(chopper));
    System.out.println(howManyIntsAndDoubles(chopper));
} 

public static int howMany(Scanner chopper) //
{
    String x = "";
    int y = 0;
    while(chopper.hasNext())
    {
        y++;
        x = chopper.next();
    }
    return y;
}

    public static int howManyInts(Scanner chopper)
        {
            String x = "";
    int y = 0;
    while(chopper.hasNext())
    {
        if (chopper.hasNextInt())
        {
            y++;
        }
        x = chopper.next();
    }
    return y;
}

public static int howManyIntsAndDoubles(Scanner chopper)
{
    String x = "";
    int y = 0;
    while(chopper.hasNext())
    {
        if (chopper.hasNextDouble())
        {
            y++;
        }
        x = chopper.next();
    }
    return y;
}

Если я введу «да 5.2 2 5.7 6 нет», то мой вывод будет: 6 0 0

, но должно быть: 6 2 4

Я знаю, что он очищает сканер после запуска первого метода, независимо от того, в каком он порядке. Даже если я преобразую сканер в другой тип данных в первых строках метода, он все равно очищает исходный.Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я предполагаю, что это академическое упражнение, и вы должны решить свою проблему с помощью сканера и одного метода на счет.Проблема в вашем коде состоит в том, что вы используете / пропускаете один и тот же сканер для каждого метода, но в методе howMany (он вызывается первым) код потребляет все токены вашего ввода.Поскольку вы не можете сбросить сканер для запуска с начала ввода снова, решение может состоять в том, чтобы объявить три сканера (опять же, я предполагаю, что это учебное упражнение, и вы должны решить его с помощью сканеров) и передать каждый нак вашим методам.Совет: вам не нужно присваивать результат chopper.next () переменной x, если вы не хотите его использовать, вы можете просто вызвать chopper.next ().

public static void main(String[] args) {
    Scanner kb = new Scanner(System.in);
    String typedStuff = kb.nextLine();
    Scanner chopperHowMany = new Scanner(typedStuff);
    Scanner chopperHowManyInts = new Scanner(typedStuff);
    Scanner chopperHowManyDoubles = new Scanner(typedStuff);

    System.out.println(howMany(chopperHowMany));
    System.out.println(howManyInts(chopperHowManyInts));
    System.out.println(howManyIntsAndDoubles(chopperHowManyDoubles.reset()));
}

public static int howMany(Scanner chopper) //
{
    int y = 0;
    while (chopper.hasNext()) {
        y++;
        chopper.next();
    }
    return y;
}

public static int howManyInts(Scanner chopper) {
    int y = 0;
    while (chopper.hasNext()) {
        if (chopper.hasNextInt()) {
            y++;
        }
        chopper.next();
    }
    return y;
}

public static int howManyIntsAndDoubles(Scanner chopper) {
    int y = 0;
    while (chopper.hasNext()) {
        if (chopper.hasNextDouble()) {
            y++;
        }
        chopper.next();
    }
    return y;
}
0 голосов
/ 11 февраля 2019

Я не уверен, что делает ваш класс прерывателей, но я предполагаю, что он разбивает входную строку на пробелы.Если это так, возможно, вы индексируете до конца прерывателя в первом методе howMany (), вызывая chopper.Next (), пока он не окажется в конце ввода.Следующий вызов chopper.Next () в другом методе будет нулевым, если вы уже указали на конец прерывателя.

Я бы порекомендовал следующее:

public static String howMany(Scanner chopper){
    String x = "";
    int y = 0;
    int doubleCount=0;
    int intCount =0;
    while(chopper.hasNext()){
        y++;
        if (chopper.hasNextDouble()){
            doubleCount++;
        }
        if(chopper.hasNextInt()){
            intCount++;
        }
        x = chopper.next();
    }
    return x+y+" "+ intCount + " " + doubleCount;
}
...