个人作业1-数组(续1)
新情況:
1.要求數(shù)組從文件讀取。
2.如果輸入的數(shù)組很大,并且有很多大的數(shù)字,就會產(chǎn)生比較大的結(jié)果(考慮一下數(shù)的溢出),請保持你的程序正常輸出。
3.另外,如果輸入文件的參數(shù)有錯誤,這個程序應該能正確退出,并顯示相應的錯誤。任何輸入錯誤都不能導致你的程序崩潰。
設計思想:
? ? ? ?首先實現(xiàn)文件的輸入輸出,向文件輸入時采取一行一個數(shù)的方式輸入,這樣在取值時可以比較簡單,一行一行的取??紤]到數(shù)組大小的不確定性,采用容器list從文件中獲取數(shù)據(jù),同時還可以很好的解決數(shù)組過大問題。最后解決數(shù)的溢出問題,采用BigInteger解決。最后進行測試,解決一些意外導致的問題。
出現(xiàn)的問題:
? ? ? ?1.在使用BigInteger時add()函數(shù)出錯,數(shù)值無法相加。
2.用list容器直接操作時出現(xiàn)了一些錯誤。
3.每次重新進行操作時新增的內(nèi)容會出現(xiàn)在舊的內(nèi)容之下。
解決方法:
1.直接運用maxstart.add(y) 數(shù)值不變,所以我創(chuàng)了一個新的BigInteger變量v,讓v=maxstart.add(y),發(fā)現(xiàn)可以得到相加的結(jié)果,之后我讓maxstart=v,問題解決。
2.直接使用list容器容易出錯,所以我通過for循環(huán)將容器中的值一一賦到String數(shù)組中。
3.我在程序的末尾加入了文件清空函數(shù)。
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("請輸入產(chǎn)生隨機數(shù)的數(shù)量:");String nums;int n;while(true)//判斷輸入是否為整數(shù) {try{nums=in.next() ;n=Integer.parseInt(nums) ;break ;}catch(Exception e){System.out.println("只能輸入整數(shù)") ;}}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()); //向文件中寫入數(shù)據(jù)out.write('\r'); // \r\n表示換行out.write('\n'); }List list = new ArrayList();BufferedReader bw = new BufferedReader(new FileReader(f));String line = null;//因為不知道有幾行數(shù)據(jù),所以先存入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");//用于判斷子數(shù)組是否小于0BigInteger x = new BigInteger("0");maxsum = new BigInteger(li[0]);BigInteger y;for(int i = 0;i < list.size();i++){if (maxstart.compareTo(x)!=1) {//忽略掉和為負數(shù)和0的子數(shù)組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();}}} }結(jié)果截圖:
總結(jié):
? ? ?目前測試的最大數(shù)組為500萬,明顯運行的非常慢,不過還可以運行,接下來的任務是盡可能優(yōu)化程序。在第三點,我對輸入的數(shù)組的數(shù)量進行了一次循環(huán)判斷,如果輸入的不是整數(shù)則重新輸入,之后增加了一個判斷文件是否存在的函數(shù),在程序末尾加了判斷文件是否為空的if語句,總之通過本次作業(yè),我進行了依次小型的單元測試,也力爭讓程序變得更完善,之后我會繼續(xù)修改,爭取能變得更好。
轉(zhuǎn)載于:https://www.cnblogs.com/liujinxin123/p/10533709.html
總結(jié)
以上是生活随笔為你收集整理的个人作业1-数组(续1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MR作业提交时指定第三方依赖jar
- 下一篇: 聊聊flink的FencedAkkaIn