新情况:
1.要求数组从文件读取。
2.如果输入的数组很大,并且有很多大的数字,就会产生比较打的结果(考虑溢出),保证程序正常输出。
3.如果输入文件的参数有错误,这个程序应该能正常输出,并显示相应的错误。任何输入错误都不能导致你的程序崩溃。
这次的题目是在上周的课程内容之上进行改进的,需要考虑三方面的问题,但由于现在的个人能力有限,还未解决第三种问题,还需继续历练自己。下面是自己的思路讲解。
首先解决的是第二个问题,在自己上周的程序代码上进行了改动,将int类型,换成了long型,由于从前的知识了解到,在java中float型和double型虽然能够容纳的字符长度更长,但是会有精度流失的问题,自己选取了long型来进行本次的个人测试部分。对呀抛出的两个异常都进行很好的解决。然后解决从文件读入以及输出的问题,通过网上查阅资料解决了,数组从文件读入进行计算的问题。
但是仍有不足,自己生成随机数输出到数组,然后进行读入的问题把并没有很好的解决,在下周上课之前要借阅其他同学的代码进行学习,来完善自己的测试。
测试截图:
下面是完整代码(其中计算部分用的是上周时间复杂度为O(n)的代码):
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.math.BigInteger; import java.util.ArrayList; import java.util.Random; public class sum03 { public static void readFileByLines(String fileName) { File file = new File(fileName); BufferedReader reader = null; try { System.out.println("以行为单位读取文件内容,一次读一行"); reader = new BufferedReader(new FileReader(file)); String tempString = null; while ((tempString = reader.readLine()) != null) { System.out.println(tempString); } reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } } } public static long[] toArrayByFileReader1(String name) { // 使用ArrayList来存储每行读取到的字符串 ArrayList<String> arrayList = new ArrayList<>(); try { FileReader fr = new FileReader(name); BufferedReader bf = new BufferedReader(fr); String str; // 按行读取字符串 while ((str = bf.readLine()) != null) { arrayList.add(str); } bf.close(); fr.close(); } catch (IOException e) { e.printStackTrace(); } // 对ArrayList中存储的字符串进行处理 int length = arrayList.size(); long[] array = new long[length]; for (int i = 0; i < length; i++) { String s = arrayList.get(i); array[i] = Long.parseLong(s); } long f=0;//定义整形变量f,为子数组最大值 long sum=0;//定义整形变量sum,为子数组求和 for(int i=0;i<length;i++) { sum = sum+array[i]; if(sum < 0) { sum=0; } if(sum > f) { f = sum; } } if(sum == 0) { for(int i=0;i<length;i++) { if(i == 0) { f = array[i]; } if(f < array[i]) { f = array[i]; } } } System.out.println("该数组的子数组之和的最大值为:"+f); // 返回数组 return array; } public static void main(String[] args) throws IOException{ String name = new String("D:\JAVA\java-1\sum03.txt"); readFileByLines(name); toArrayByFileReader1(name);//文件路径 } }