从文件读入数组并求最大子数组和

it2022-05-09  29

题目: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


最新回复(0)