不同的Java扫描仪用于不同类型的输入

问题描述 投票:0回答:8

想象一下以下场景: 我有一个程序要求输入整数,然后输入字符串。

int age=0;
String name;
Scanner sc = new Scanner(System.in);

System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");
name= sc.nextLine();

使用 aobe 代码时,我没有机会输入名字。所以通常我会声明 2 个扫描仪对象,如下所示:

int age=0;
String name;
Scanner sc = new Scanner(System.in);
Scanner sc2 = new Scanner(System.in);    //2nd Scanner object

System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");
name= sc2.nextLine();                    //Using 2nd Scanner Object

我的问题是:是否有必要声明多个扫描仪对象来接受不同类型的输入?我的做法是否正确?

这个问题我已经记在心里很多年了。 (SO中的几个问题提到了多个扫描仪,但他们的问题只使用了一个扫描仪对象,所以我今天问这个。)

java java.util.scanner
8个回答
6
投票

@skiwi 只使用一个

Scanner
是正确的,所以你做得对。它不起作用的原因是
nextInt()
消耗了组成整数的所有字符,但它不触及行尾字符。因此,当调用
nextLine()
时,它会发现行尾字符之前没有字符,因此它认为输入了一个空行,并且返回一个空字符串。但是,
nextLine()
确实会消耗行尾字符,因此如果您在执行
sc.nextLine();
之前调用
name = sc.nextLine();
一次,它应该可以工作。


3
投票

您没有机会输入名称,因为

nextInt()
不会读取换行符
'\n'
(用户按 Enter 后输入),而
nextLine()
会读取。因此,一旦您调用
name = sc.nextLine();
,它就会读取
'\n'
尚未读取的
nextInt()
字符。

如果您正在扫描相同的内容(例如

System.in
),则绝对不要创建新的扫描仪 - 仅当您正在扫描其他内容(例如不同的文件或其他内容)时才更改扫描仪。

要使您的代码正常工作(仅使用一个扫描仪实例),请使用以下命令:

int age = 0;
String name;
Scanner sc = new Scanner(System.in);

System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");

sc.nextLine(); // "dispose" of the '\n' character
               // so that it is not recorded by the next line

name = sc.nextLine();

// print your findings
System.out.println("------\nAge: " + age + "\nName: " + name);

输入/输出示例:

Enter Age: 17
Enter Name: Michael
------
Age: 17
Name: Michael

2
投票

对于要扫描的每个对象,您只能使用一个

Scanner
实例。在这种情况下,您正在从
System.in
进行读取,因此同时在同一个扫描仪上打开两个扫描仪甚至没有意义。

所以你肯定想选择第一个选项,那么问题来了,它有什么问题:

好吧,你要求

sc.nextInt()
,一个整数,而名字很少是整数。您很可能正在寻找
name = sc.next()
来表示一个单词或
name = sc.nextLine()
来表示整个句子(直到按下回车键)。

还要注意,在

sc.nextInt()
之后,实际上在任何
sc.next***()
之后,您需要Enter


0
投票

您还可以使用:

name = sc.next();

0
投票

这必须完美运行。我测试了一下。

int age=0;
String name;
Scanner sc = new Scanner(System.in);

System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");
name= sc.nextLine();

0
投票

为什么这段代码不起作用?

package Programs;
import java.util.Scanner;
public class LibraryManagement {
    Scanner s = new Scanner(System.in);
    String Sname, Bname, Bauthor;
    int Sid,Sclass,Bid;
    void StudInfo()
    {
    
    System.out.print("Enter the Student Id: ");
    Sid=s.nextInt();
    
    System.out.print("Enter the Student name: ");
    Sname=s.nextLine();
    
    System.out.print("Enter the Student Class: ");
    Sclass=s.nextInt();
    
    System.out.println("Student detail is saved:  \n Id : "+ Sid + " Name : "+ Sname+ " Class : ");
    
    }
    public static void main(String[] args) {
          LibraryManagement obj= new LibraryManagement();
          obj.StudInfo();
        }
    
    }

输出是:
输入学号:10
输入学生姓名: 输入学生班级:


0
投票

你可以通过进一步的例子来理解这一点。不能声明单个扫描器类来获取不同数据类型的输入。因此,在 Java 中获取输入时要具体。如果您要获取多个字符串输入,则为其创建一个特定的扫描器类,如果您要为 int 获取多个输入,则为其创建一个特定的扫描器类,这取决于不同的数据类型,如果您想获取输入然后在 char 中为其创建一个特定的扫描器类。它将帮助我们减少编写更多代码,因此如果您采用 10 个 int 输入,然后为其创建一个特定的扫描器类,并将这些单个扫描器类名称用于 10 个输入,基本上,这将减少我们为每个 int 输入编写 9 行更多代码,如果您要接受 10 个字符串输入,则为其创建一个特定的扫描器类,如果您要接受 10 个字符输入,则为其创建一个特定的扫描器类,依此类推......:) 这将减少为每种类型的输入编写代码。

代码

    import java.util.*;
    import java.lang.*;
    import java.io.*;

    public class arraylistExample {
        public static void main(String[]args){
            // This is a common scanner class for string type of inputs 
            Scanner stringcommonforall=new Scanner(System.in);
            // This is a common scanner class for integer type of inputs 
            Scanner intcommonforall=new Scanner(System.in);
            int size;
            int pos=0;
            boolean findornot=false;
            String found;
            ArrayList<String> name=new ArrayList<String>();
            System.out.print("Enter the size of the ArrayList >> ");
            size=intcommonforall.nextInt();
            // when your are using one scanner for all types of input then you will get the error 
            for(int i=0;i<size;i++){
                System.out.print(">> ");
                name.add(stringcommonforall.nextLine());
            }
            System.out.print("Enter the element you want to search inside the arraylist >> ");
            found=stringcommonforall.nextLine();
            for(String i:name){
                if(i.equals(found)){
                    findornot=true;
                    pos=name.indexOf(found);
                    break;
                }
            }
            if(findornot==true){
                System.out.println("The elements inside he arraylist >> "+name);
                System.out.println("The element >> "+found+" is found at the positioin >> "+pos);
            }
            else{
                System.out.println("The elements inside he arraylist >> "+name);
                System.out.println("The element >> "+found+" is not found inside the arraylist ");
            }
        }
    }

输出

    Enter the size of the arraylist >> 5
    >> lorem ipsum
    >> xyz
    >> zyx 1
    >> june
    >> done
    Enter the element you want to search inside the arraylist >> done
    The elements inside he arraylist >> [lorem ipsum, xyz, zyx 1, june, done]
    The element >> done is found at the positioin >> 4

0
投票

导入java.util.Scanner;

公开课测试{

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int i =0;
    while (i<5) {
        System.out.println("Enter the number");
        int n = Integer.parseInt(sc.nextInt());
        System.out.println("Enter the String");
        String s = sc.nextLine();
        i++;
    }
}

}

© www.soinside.com 2019 - 2024. All rights reserved.