StreamTokenizer类与BufferReader类的使用。

    利用Scanner类进行输入时正常情况下都是是够用。不过当输入量和输出量太大的时候(达到百万到千万),那么这种输入方式效率就很低。

这时候可以用StreamTokenizer类来输入基本数据类型,如int,double,float boolean  short   long  byte(只能这七种,其他不行,例如char,String)用法如下:

import java.io.*;

public class Main
{
    public static void main(String[] args) throws IOException
    {
      StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
      double a, b;
      
        while(in.nextToken() != StreamTokenizer.TT_EOF)
        {
           a = (double)in.nval;
           in.nextToken();
           b = (double)in.nval;
            System.out.println("a + b = "+(a+b));
        }
    }
}

其中in.nextToken()代表输入,遇到空格键,Enter键,Tab键结束一次输入。(XXX)in.nval是将输入的数据转化成自己想要的数据类型(没输入一次转化一次)。

例如杭电OJ的超级赛亚ACMer,采用StreamTokenizer来输入,用Scanner会超时!!

package com.xuan.main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;

public class 超级赛亚ACMer {
public static void main(String[] args) throws IOException {
	StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	long m,t,k;
	int n;
	in.nextToken();
	t=(int)in.nval;
	for(int i=0;i<t;i++) {
		int temp=0;
		in.nextToken();
		n=(int)in.nval;
		in.nextToken();
		m=(long)in.nval;
		in.nextToken();
		k=(long)in.nval;
		long [] a=new long[n];
		for(int j=0;j<n;j++) {	
			in.nextToken();
			a[j]=(long)in.nval;
		
		}	
		Arrays.sort(a);
		if(m>a[n-1]) {
			System.out.println("Case #"+(i+1)+":");
			System.out.println("why am I so diao?");
		}
		else if(m<a[0]) {
			System.out.println("Case #"+(i+1)+":");
			System.out.println("madan!");
		}
		else {
		for(int j=0;j<n;j++) {
			if(m==a[j]) {
				temp=j;
				break;
			}
			else if(m<a[j]) {
				temp=j-1;
				break;
			}
		}
		for(int j=temp;j<n-1;j++) {
			if(a[j+1]-a[j]>k) {
				System.out.println("Case #"+(i+1)+":");
				System.out.println("madan!");
				break;
			}
			else {
				k--;
				if(j==n-2) {
					System.out.println("Case #"+(i+1)+":");
					System.out.println("why am I so diao?");
				}
					
			}
		}
	}
	}
 }
}

          用BuferrReader类(缓冲流)来输入的readLine()方法来输入字符串。当需要输入字符串次数超过1000次时,就应该用这个类输入,性能比Scanner类提升15ms左右。这个类主要有两个方法:read readLine.

readLine():输入一行的字符串,结束符为enter键。

read():返回从键盘输入的字符的SCAll值。(切记空格键,enter键也算字符)。

代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class tuyiry {
public static void main(String[] args) throws IOException {
	 BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
     String s=in.readLine();
     System.out.println(s);
			 }
}

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值