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


    题目: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循环。

  • 相关阅读:
    前端笔记-css sprite,font+html,font+css
    Python基础教程(第2版•修订版)代码清单2-3 勘误
    Python基础教程(第2版•修订版)代码清单2-3 勘误
    程序员健康Tips
    程序员健康Tips
    WAMP安装,期间提示丢失VCRUNTIME140.dll
    WAMP安装,期间提示丢失VCRUNTIME140.dll
    安装Vmware时竟然也会报错,错误信息见图
    安装Vmware时竟然也会报错,错误信息见图
    无符号数tips
  • 原文地址:https://www.cnblogs.com/zjl-0217/p/10549489.html
Copyright © 2020-2023  润新知