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

题目: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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值