题目:1.要求数组从文件读取。 2.如果输入的数组很大, 并且有很多大的数字, 就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出。 3.另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。 任何输入错误都不能导致你的程序崩溃。
设计思路:先判断要读取数据的文件是否存在,如果不存在,输出文件不存在或打开错误语句,并且结束程序。文件存在,从文件中读取数组,先将数组放在一个字符串容器中,然后对每一个字符串进行判断,定义一个isInt方法判断字符串是否为整形,不是的话输出文件中含有不是整形的数,并且结束程序,是的话则存进数组。定义的子数组和数组长度为int lon = ((1+array.length)*array.length)/2;然后利用for循环嵌套然后求出所有子数组和,最后比较子数组和中的最大值。
源程序代码:
package 从文件读数组; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class Main { public static boolean isInt(String val) { try { Integer.parseInt(val); return true; } catch (NumberFormatException e) { return false; } } public static void judeFileExists(File file) { if (file.exists()) { System.out.println("file exists"); } else { System.out.println("file not exists, please create it ..."); System.exit(0); } } public static int[] toArrayByFileReader1(String name) { File file = new File(name); judeFileExists(file); 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(); int[] array = new int[length]; for (int i = 0; i < length; i++) { String s = arrayList.get(i); if(!isInt(s)) { System.out.println("数组中存在不是整形的数"); System.exit(0);//终止程序 } array[i] = Integer.parseInt(s); } // 返回数组 return array; } /*求所有子数组的和 放进sum数组中*/ public static void main(String args[]) { int[] array = toArrayByFileReader1("shuju.txt"); System.out.println("从文件中读取的数组"); for(int i = 0;i < array.length ;i++) {//输出从文件中读取的数组 System.out.print(array[i]+" "); } int lon = ((1+array.length)*array.length)/2; if(lon>30000000) { System.out.println("数组太大!"); System.exit(0); } int[] sum = new int[lon]; int changdu = 0; for(int i = 0;i < array.length ;i++) {//生成子数组和 int asum = 0; for(int j = 0; j < array.length - i;j++) { asum = asum + array[i+j]; sum[changdu] = asum; changdu++; } } //输出所有子数组的和的数值 System.out.println(" "); System.out.println("输出所有子数组的和的数值"); int max = sum[0]; for(int k = 0; k < lon;k ++) { System.out.print(sum[k]+" "); } for(int m = 1; m < lon;m++) { if(sum[m]>max) //求sum数组最大的值 max = sum[m]; } System.out.println(" "); System.out.println("最大子数组和为:" + max);//输出最大的子数组和 } }结果截图:
个人反思:JAVA语言对文件的操作有所忘记,需要经常复习。对于这个问题,最开始找不到思路应该一步步的来解决问题,先从打开文件读取数据开始。对于有时间复杂度限制的问题,应该尽量的多用方法,用if语句,而不是用很多for循环。
转载于:https://www.cnblogs.com/zjl-0217/p/10549489.html
