Java2游戏编程读书笔记第四章参考答案

来源:互联网 发布:网络投票怎么刷票软件 编辑:程序博客网 时间:2024/05/16 08:29
 
4.1写出保存一个链表顺序的代码。(提示:Java LinkedList是FIFO结构——哪些类具有LIFO结构?)
答:
import java.util.*;
 
class LinkedTest41{
      
       public static void main(String[] args){
              LinkedList l=new LinkedList();
              System.out.println("==================================================");
              System.out.println("add与get方法配合使用:");
              System.out.println("==================================================");
              for(int i=0;i<10;i++){
                     //直接将指定元素追加到此列表的结尾。
                     l.add(i);
                     //返回此列表中指定位置处的元素(并未移出链表)。
                     System.out.print(l.get(i)+" ");
              }
              System.out.println("/nSize:"+l.size());
             
              System.out.println("/n/n/n==================================================");
              System.out.println("addFirst与getFirst方法配合使用:");
              System.out.println("==================================================");
              for(int i=0;i<10;i++){
                     //将给定元素插入此列表的开头。
                     l.addFirst(i);
                     //返回此列表的第一个元素(并未移出链表)
                     System.out.println(l.getFirst());
              }
              System.out.println("/nSize:"+l.size());
             
              System.out.println("/n/n/n==================================================");
              System.out.println("addLast与getLast方法配合使用:");
              System.out.println("==================================================");
              for(int i=0;i<10;i++){
                     //将给定元素追加到此列表的结尾。
                     //(与 add 方法功能相同;包括它只是出于一致性考虑。)
                     l.addLast(i);
                     //返回此列表的最后一个元素(并未移出链表)
                     System.out.println(l.getLast());
              }
              System.out.println("/nSize:"+l.size());
             
              System.out.println("/n/n/n==================================================");
              System.out.println("removeFist方法测试");
              System.out.println("==================================================");
              for(int i=0;i<10;i++){
                     //移除并返回此列表的第一个元素。
                     System.out.println(l.removeFirst());
              }
              System.out.println("/nSize:"+l.size());
             
              System.out.println("/n/n/n==================================================");
              System.out.println("removeLast方法测试");
              System.out.println("==================================================");
              for(int i=0;i<10;i++){
                     //移除并返回此列表的最后一个元素。
                     System.out.println(l.removeLast());
              }
              System.out.println("/nSize:"+l.size());
             
              System.out.println("/n/n/n==================================================");
              System.out.println("remove方法测试");
              System.out.println("==================================================");
              for(int i=0;i<l.size();i++){
                     //找到并移除此列表的头(第一个元素)。
                     System.out.println(l.remove());
              }
              System.out.println("/nSize:"+l.size());
             
       }
}
这段程序比较有趣的是:最后一个for循环中,在移除用add添加的的元素时,只能移除一半,不知道是什么原因。
4.2练习4.1的代码会不会与保存一个StringBuffer对象的内容有很大的不同?
答:不太明白这个题目想表达的意思。
4.3写一个工具类,封装BufferedReader类,并从键盘读入不同类型的信息,如float值,int值,boolean值等。可以写如readInt,ReadFloat等的方法,确保每个组件只接收有效的输入,并且在输入值不正确时提示用户重新输入数据。
import java.io.*;
/**
 *写一个工具类,封装BufferedReader类,
 *并从键盘读入不同类型的信息,如float值,int值,boolean值等。
 *可以写如readInt,ReadFloat等的方法,确保每个组件只接收有效的输入,
 *并且在输入值不正确时提示用户重新输入数据。
 */
 
class BufferedReaderToolkit{
      private static BufferedReader br=
                                  new BufferedReader(new InputStreamReader(System.in));
     
      public static int readInt(){
             try{
                    String strTemp=br.readLine();
                    return Integer.parseInt(strTemp);
             }catch(IOException e){
                    System.out.print("输入有误,请重输:");
                    return readInt();//使用递归调用来完成重输
             }catch(NumberFormatException e){
                    System.out.print("数据格式有误,您是不是输入了字母?请重输:");
                    return readInt();//使用递归调用来完成重输
             }
            
      }
     
      public static float readFloat(){
             try{
                    String strTemp=br.readLine();
                    return Float.parseFloat(strTemp);
             }catch(IOException e){
                    System.out.print("输入有误,请重输:");
                    return readFloat();//使用递归调用来完成重输
             }catch(NumberFormatException e){
                    System.out.print("数据格式有误,您是不是输入了字母?请重输:");
                    return readFloat();//使用递归调用来完成重输
      }
     
      public static boolean readBoolean(){
             try{
                    String strTemp=br.readLine();
                    return Boolean.parseBoolean(strTemp);
             }catch(IOException e){
                    System.out.print("输入有误,请重输");
                    return readBoolean();//使用递归调用来完成重输
             }catch(NumberFormatException e){
                    System.out.print("数据格式有误,您应该输入/"true/"或/"false/"?请重输");
                    return readBoolean();//使用递归调用来完成重输
             }
      }
 }
 
 class BufTest{
      public static void main(String[] args){
             System.out.println("请输入一个整数:");
             System.out.println("您输入了:"+BufferedReaderToolkit.readInt());
             System.out.println("请输入一个小数:");
             System.out.println("您输入了:"+BufferedReaderToolkit.readFloat());
             System.out.println("请输入一个boolean数:");
             System.out.println("您输入了:"+BufferedReaderToolkit.readBoolean());
      }
 }
这个题目做完了,发现boolean值不会出现数据格式异常。除了字符“true”之外,其余字符均转为“false”。
4.4写一个程序(使用BufferedReader类),从名为file.txt的文件读入Strings。Reader应该连续地读遍全文件。文件输入应该立即改变到标准输出。文件不存在或打不开时输出一个错误消息。(提示:使用java.io包中的FileReader类)
import java.io.*;
class FileReaderTest{
       public static void main(String args[]){
              try{
                     BufferedReader fr=new BufferedReader(new FileReader(new File("file.txt")));
                     String strTemp;
                     while((strTemp=fr.readLine())!=null){
                            System.out.println(strTemp);
                     }
              }catch(IOException e){
                     e.printStackTrace();
              }
       }
}
4.5重写Fibonacci程序,使用Java.util包提供的Timer和TimerTask类。建议保持Fibonacci类框架,但是用一个匿名内部类来做定时。
import java.util.Timer;
import java.util.TimerTask;
import java.util.Date;
//计算并打印Fibonacci数列的Thread,并利用Timer类来控制时间
public class TimerFibonacci{
      
       //数列中的前一个数
       private long previous;
      
       //数列中的当前数
       private long current;
      
       //构造一个新的Fibonacci数列
       public TimerFibonacci(){
              previous=1;
              current=1;
       }
      
      
      
       private void printNext(){
              System.out.print(current+", ");
       }
      
       //计算数列中的下一个数,它是数列中前两个数的和
       private void update(){
              long temp=current;
              current=previous+current;
              previous=temp;
       }
      
       public void execute(){
              Timer t=new Timer();
             
              t.schedule(new TimerTask(){//使用匿名类重写TimerTask
                     int count=0;
                    
                     public void run(){
                            //打印数列中的前两个数字
                            if(count==0){
                                   printNext();
                                   printNext();
                                   count++;
                            }
                           
                            update();
                           
                            //只要当前的数列值超过了最大的long型数值,它就会截断为负数
                            //只要当前值为负数就终止这个线程的执行
                            if(current<0L){
                                   System.out.println("/n已达长整型值极限!线程消毁...");
                                  
                                   return;
                            }
                           
                            //打印下一个Fibonacci数
                            printNext();
                            }
                    
                    
                    
              },new Date(),1000L);//要写三个参数的schedule才行。
              //第一个参数:要执行的任务
              //第二个参数:任务开始的时间
              //第三个参数:任务重复的间隔时间
             
       }
      
      
       public static void main(String[] args){
              new TimerFibonacci().execute();
       }
 
 
}
//本程序有一个bug当增加到型值的极限的时候,无法将时间停止     
第一次使用Timer,发现它的用处还是蛮大的,似乎可以用来做一个任务管理器,等以后有时间,来试试
 
原创粉丝点击