您的位置:首页 > 编程语言 > Java开发

【ThinkingInJava】15、如何让Scanner作用到一个类上

2015-04-30 21:01 99 查看
比如我们有一个类叫RandomDoubles

/**
* 书本:《Thinking In Java》
* 功能:当我们有一个Readable类的时候,如何让Scanner(这个类的构造器接受的就是一个Readable接口)作用于他,这个类可以产生随机浮点数
* 文件:RandomDoubles.java
* 时间:2015年4月3日16:22:11
* 作者:cutter_point
*/
package Lesson9Interfaces;

//import java.util.Date;
import java.util.Random;

public class RandomDoubles 
{
	private static Random rand = new Random();
	//产生一个浮点数
	public double next() { return rand.nextDouble(); }
	
	public static void main(String [] args)
	{
		RandomDoubles rd = new RandomDoubles();
		//输出7个浮点数
		for(int i = 0; i < 7; ++i)
		{
			System.out.println(rd.next() + "  ");
		}
	}

}


然后我们用适配器模式,让Scanner可以作用到这个类上面

/**
* 书本:《Thinking In Java》
* 功能:当我们有一个Readable类的时候,如何让Scanner作用于他,这个类可以产生随机浮点数
* 文件:AdaptedRandomDoubles.java
* 时间:2015年4月3日16:30:18
* 作者:cutter_point
*/
package Lesson9Interfaces;

import java.io.IOException;
import java.nio.CharBuffer;
import java.util.Scanner;

public class AdaptedRandomDoubles extends RandomDoubles implements Readable
{
	private int count;
	//构造函数,传入count
	public AdaptedRandomDoubles(int count)
	{
		this.count = count;
	}
	
	public int read(CharBuffer cb) throws IOException //这个函数是为了给Scanner提供数据源
	{
		if(count-- == 0)
		{
			//System.out.println("使用了read!!!");
			return -1;			
		}
		
		String result = Double.toString(this.next()) + " ";
		cb.append(result);	//添加到cb中
		
		return result.length();
//		return 0;
	}
	
	public static void main(String [] args)
	{
		Scanner s = new Scanner(new AdaptedRandomDoubles(10));
//		System.out.println(s.next());
		while(s.hasNextDouble())
			System.out.println(s.nextDouble() + " ");
	}
}


运行结果:

RandomDoubles:

0.11393034354413722

0.40408793420996947

0.2540807036971118

0.8903725146722422

0.44314960435529926

0.557234457792441

0.832818728830627

AdaptedRandomDoubles:

0.39757721272307445

0.9536173997034262

0.5155921375811436

0.39309093706654774

0.6936676294469794

0.3397964123945878

0.7331370887609343

0.24696295894338338

0.22107145268274675

0.940024095523216
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: