一个整形数组中最大值求和问题(2)

新情况:

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);//文件路径
       
    }
}
原文地址:https://www.cnblogs.com/Qi77/p/10554436.html