个人作业1-数组(续1)
新情況:
1.要求數(shù)組從文件讀取。
2.如果輸入的數(shù)組很大,并且有很多大的數(shù)字,就會(huì)產(chǎn)生比較大的結(jié)果(考慮一下數(shù)的溢出),請保持你的程序正常輸出。
3.另外,如果輸入文件的參數(shù)有錯(cuò)誤,這個(gè)程序應(yīng)該能正確退出,并顯示相應(yīng)的錯(cuò)誤。任何輸入錯(cuò)誤都不能導(dǎo)致你的程序崩潰。
設(shè)計(jì)思想:
? ? ? ?首先實(shí)現(xiàn)文件的輸入輸出,向文件輸入時(shí)采取一行一個(gè)數(shù)的方式輸入,這樣在取值時(shí)可以比較簡單,一行一行的取。考慮到數(shù)組大小的不確定性,采用容器list從文件中獲取數(shù)據(jù),同時(shí)還可以很好的解決數(shù)組過大問題。最后解決數(shù)的溢出問題,采用BigInteger解決。最后進(jìn)行測試,解決一些意外導(dǎo)致的問題。
出現(xiàn)的問題:
? ? ? ?1.在使用BigInteger時(shí)add()函數(shù)出錯(cuò),數(shù)值無法相加。
2.用list容器直接操作時(shí)出現(xiàn)了一些錯(cuò)誤。
3.每次重新進(jìn)行操作時(shí)新增的內(nèi)容會(huì)出現(xiàn)在舊的內(nèi)容之下。
解決方法:
1.直接運(yùn)用maxstart.add(y) 數(shù)值不變,所以我創(chuàng)了一個(gè)新的BigInteger變量v,讓v=maxstart.add(y),發(fā)現(xiàn)可以得到相加的結(jié)果,之后我讓maxstart=v,問題解決。
2.直接使用list容器容易出錯(cuò),所以我通過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包裝文件,并設(shè)置文件可追加OutputStream out = new FileOutputStream(f,true);Scanner in=new Scanner(System.in);System.out.println("請輸入產(chǎn)生隨機(jī)數(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;//因?yàn)椴恢烙袔仔袛?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) {//忽略掉和為負(fù)數(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ùn)行的非常慢,不過還可以運(yùn)行,接下來的任務(wù)是盡可能優(yōu)化程序。在第三點(diǎn),我對輸入的數(shù)組的數(shù)量進(jìn)行了一次循環(huán)判斷,如果輸入的不是整數(shù)則重新輸入,之后增加了一個(gè)判斷文件是否存在的函數(shù),在程序末尾加了判斷文件是否為空的if語句,總之通過本次作業(yè),我進(jìn)行了依次小型的單元測試,也力爭讓程序變得更完善,之后我會(huì)繼續(xù)修改,爭取能變得更好。
轉(zhuǎn)載于:https://www.cnblogs.com/liujinxin123/p/10533709.html
總結(jié)
以上是生活随笔為你收集整理的个人作业1-数组(续1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MR作业提交时指定第三方依赖jar
- 下一篇: 聊聊flink的FencedAkkaIn