ACM模式下Java 输入教程(简单易懂)

写在前面

本教程是笔者自己的一些学习总结,可能不够全面,但是应对大多数需要手动处理输入、输出的笔试题来说,应该已经足够

输入

读取输入需要导入的包java.util.Scanner

读取输入的常用方法:

  • 读取数字:nextInt()(最常用)、nextDouble()
  • 读取字符串:next()nextLine()

通常来说,输入有以下几种形式
1、单独的数字组成了一行(eg: 1
2、多个数字组成一行,每个数字之间由空格隔开(eg:1 2 3
3、字符和数字组成了一行,由空格隔开(eg:a b 2
4、多个单词组成了一行,由空格隔开(eg:apple bee cow)

接下来,我将针对每一种输入形式,来给出代码实例

1、单独的数字组成了一行(eg: 1

这种情况下,通常是采用nextInt()来读取输入。

这里先说一下nextInt()的几点注意事项
1、它会跳过前导的空白符(也就是说,在数字前的空格、回车、制表符都会被跳过)

2、它不会消耗空白符(空格、制表符、回车符会留在缓冲区)

3、因此,当nextInt()nextLine()连续使用的话,会导致后者无法正常读取输入(后者会读取回车符,然后结束读取)(解决办法就是在两者之间插入一条in.nextLine()

import java.util.Scanner;

public class Prac {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //读取数字
        int n = in.nextInt(); //nextInt()不会消耗回车符,但是会跳过前导空白符(空格、回车、制表符)
        //in.nextLine(); //在这里可以使用它来消耗掉缓冲区中的回车符
        String s = in.nextLine();//此语句读不到任何语句,具体原因参考上方注意事项
    }
}

2、多个数字组成一行,每个数字之间由空格隔开(eg:1 2 3

这种情况下直接使用nextInt()读取就好了,它会自动跳过空格符

import java.util.Scanner;

public class Prac {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //读取数字
        int n = in.nextInt(); 
        int m = in.nextInt(); 
       	int l = in.nextInt();   
    }
}

3、字符和数字组成了一行,由空格隔开(eg:a b 2
4、多个单词组成了一行,由空格隔开(eg:apple bee cow)

这种字符和数字混合输入,或者多个单词组合的情况,都可以统一处理,可以采用next或者nextLine()

这里说一下两者的注意事项
1、next()跳过前导空白字符(包括回车符),然后读取遇到的第一个空格之前的所有数据,它不会消耗空白字符

2、nextLine()不会跳过前导空白符,它会读取整行数据直到遇到回车符,而且它会消耗回车符(但不会存储回车符)

我更喜欢使用后者,所以这里只给出使用nextLine()的示例

import java.util.Scanner;

public class Prac {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
		//假设输入是:abc def(处于同一行)
        //把nextLine()读取到的字符串用空格隔开,然后存入字符串数组
        String[] strArray = in.nextLine().split(" ");
        String s1 = strArray[0];//s1存储:"abc"
        String s2 = strArray[1];//s2存储:"def" 
    }
}
import java.util.Scanner;

public class Prac {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
		/**
			假设输入如下:
			1
			abc def
			apple
		*/
        //假设在使用 nextLine()之前使用了 nextInt()
        int n = in.nextInt();//n的值:1
        in.nextLine();//这行语句用来消耗缓冲区中的回车符
        String[] strArray = in.nextLine().split(" ");
        String s1 = strArray[0];//s1存储字符串:abc
        String s2 = strArray[1];//s2存储字符串:def
        //由于 nextLine()会自动消耗回车符,所以可以在读取新的一行时放心使用nextLine()
        String s3 = in.nextLine();//这里提前知道第三行只有一个单词,所以不使用split(" ");
    }
}

循环读取输入

有些时候,题目可能不会明确给出有多少行数据,而是给出输入终止样式。

这时候需要使用循环不断读取,直到读取到的输入是终止标识。

这种情况下我通常采用的方式是使用hasNextLine(),来检查输入流中是否还有一行(包括空行),不跳过任何字符。它通常和nextLine()组合使用

下方我将给出示例代码,提供一个可供使用的模板

import java.util.Scanner;

public class Prac {
    public static void main(String[] args) {
    	...//一些变量定义、声明
		/**
			假设输入如下:(0000是输入终止标识)
			abc
			def
			ghi
			wqr
			ape
			0000
		*/
        Scanner in = new Scanner(System.in);
		while(in.hasNextLine()){
			String s =  in.nextLine();
			if(s.equals("0000")) //注意!字符串比较要用equals()
				break;
			list.add(s);//假设定义了一个集合
		}
        ...
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值