个人作业1-数组(续1)

新情况:

  1.要求数组从文件读取。

  2.如果输入的数组很大,并且有很多大的数字,就会产生比较大的结果(考虑一下数的溢出),请保持你的程序正常输出。

  3.另外,如果输入文件的参数有错误,这个程序应该能正确退出,并显示相应的错误。任何输入错误都不能导致你的程序崩溃。

设计思想:

       首先实现文件的输入输出,向文件输入时采取一行一个数的方式输入,这样在取值时可以比较简单,一行一行的取。考虑到数组大小的不确定性,采用容器list从文件中获取数据,同时还可以很好的解决数组过大问题。最后解决数的溢出问题,采用BigInteger解决。最后进行测试,解决一些意外导致的问题。

出现的问题:

       1.在使用BigInteger时add()函数出错,数值无法相加。

  2.用list容器直接操作时出现了一些错误。

  3.每次重新进行操作时新增的内容会出现在旧的内容之下。

解决方法:
  1.直接运用maxstart.add(y) 数值不变,所以我创了一个新的BigInteger变量v,让v=maxstart.add(y),发现可以得到相加的结果,之后我让maxstart=v,问题解决。

  2.直接使用list容器容易出错,所以我通过for循环将容器中的值一一赋到String数组中。

  3.我在程序的末尾加入了文件清空函数。

package shuzuxu;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.*;
public class shuzu {
    public static void main(String[] args) throws Exception{
                File f = new File("hello.txt");
                judeFileExists(f);//判断文件是否存在
                //用FileOutputSteam包装文件,并设置文件可追加
                OutputStream out = new FileOutputStream(f,true);
                Scanner in=new Scanner(System.in);
                System.out.println("请输入产生随机数的数量:");
                String nums;
                int n;
                 while(true)//判断输入是否为整数
                {
                      try
                      {
                       nums=in.next() ;
                       n=Integer.parseInt(nums) ;
                               break ;
                      }
                      catch(Exception e)
                      {
                       System.out.println("只能输入整数") ;
                      }
                }
                for(int i=0;i<n;i++)
                {
                    java.util.Random r=new java.util.Random();
                    String s=Integer.toString(r.nextInt());
                    out.write(s.getBytes()); //向文件中写入数据
                    out.write('\r'); // \r\n表示换行
                    out.write('\n'); 
                }
                List list = new ArrayList();
                BufferedReader bw = new BufferedReader(new FileReader(f));
                 String line = null;
                   //因为不知道有几行数据,所以先存入list集合中
                   while((line = bw.readLine()) != null){
                       list.add(line);
                   }
                   //bw.close();
                   int a=list.size();
                    String[] li=new String[a];
                   for(int i=0;i<list.size();i++)
                   {
                       li[i]=(String) list.get(i);
                       System.out.println(li[i]);
                   }
                   BigInteger maxsum = new BigInteger("0");
                   BigInteger maxstart = new BigInteger("0");//用于判断子数组是否小于0
                   BigInteger x = new BigInteger("0");
                    maxsum = new BigInteger(li[0]);
                    BigInteger y;
                    for(int i = 0;i < list.size();i++)
                    {
                        if (maxstart.compareTo(x)!=1) {//忽略掉和为负数和0的子数组
                            maxstart = new BigInteger(li[i]);
                        }else {
                            y= new BigInteger(li[i]);
                            BigInteger v=maxstart.add(y);
                            maxstart=v;
                        }
                        
                        if (maxsum.compareTo(maxstart)<0) {
                            maxsum = maxstart;
                        }
                    }
                    System.out.println("最大值为:" + maxsum);
                    FileWriter fileWriter =new FileWriter(f);
                    fileWriter.flush();
                    fileWriter.close();
                    String line1 = null;
                       if((line1 = bw.readLine()) == null){
                           System.out.println("文件清空成功");;
                       }
                    
            }
    public static void judeFileExists(File file) {//判断文件是否存在
        
                if (file.exists()) {
                     System.out.println("file exists");
                 } else {
                   System.out.println("file not exists, create it ...");
                     try {
                         file.createNewFile();
                     } catch (IOException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
                     }
                 }
         }
}

结果截图:

总结:

     目前测试的最大数组为500万,明显运行的非常慢,不过还可以运行,接下来的任务是尽可能优化程序。在第三点,我对输入的数组的数量进行了一次循环判断,如果输入的不是整数则重新输入,之后增加了一个判断文件是否存在的函数,在程序末尾加了判断文件是否为空的if语句,总之通过本次作业,我进行了依次小型的单元测试,也力争让程序变得更完善,之后我会继续修改,争取能变得更好。

posted @ 2019-03-14 21:39  苍天の笑  阅读(165)  评论(0编辑  收藏  举报