个人作业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语句,总之通过本次作业,我进行了依次小型的单元测试,也力争让程序变得更完善,之后我会继续修改,争取能变得更好。