数组从文件中读取(接上问题)

 

设计思路:首先要实现随机生成一个范围内的整数写入txt文件,然后从文件中读取信息(按行读取,还是一行一行的读空格来分离数据)。然后需要判断读入的信息是不是整数(考虑到不是自己生成的txt),其次保证数组长度可以很大,以及数组中含有特别大的数,程序可以正常运行。

package SHUZU;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class shuzu {
	public static int random_num(int a,int b)//一定范围内随机数获取
	{
		int c=(int) (Math.random()*(b-a+1));
		return c+a;

	}
	public static void WriterFun(){
        //写入文本文档中
        File file = new File("input.txt");
        if(!file.exists()){
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(file));
            
   
            for(int i=0;i<1000;i++){
                int nums = random_num(-1000000,2000000);
                //将int 转化为 String类型
                if(i!=0)
                	bw.write(" "+Integer.toString(nums));
                else bw.write(Integer.toString(nums));
                //bw.newLine();
            }
            bw.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
	
	public static void main(String[] args) {		
		WriterFun();//调用		
//		int a[]=new int[10];
//		Scanner input=new Scanner(System.in);
//		for(int i=0;i<=9;i++)
//		{
//			a[i]=input.nextInt();
//		}
//		input.close();

		List<Integer> shuzu=new ArrayList<Integer>();//构建List集合将读取的信息存到shuzu中
		String pathname = "input.txt";
		try ( FileReader reader = new FileReader(pathname);
				BufferedReader br = new BufferedReader(reader) 
				){
			String line;
			while ((line = br.readLine()) != null) {
				// 一次读入一行数据
				String []strlist=line.split(" ");//按空格来拆分字符串
				for(String it:strlist)
				{
					Pattern p=Pattern.compile("-?[0-9]*");//正则表达式判断每一个拆分的数据是否符合规定的标准
					Matcher m=p.matcher(it);
					if(m.matches())
					{
					int i;
					i=Integer.parseInt(it);
					shuzu.add(i);
					}
					else
					{
						System.out.println("文件中含有非法字符");
						return;
					}
				}
				
				//System.out.println(line);
			}
//			System.out.println(shuzu.get(shuzu.size()-1));
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		List<Integer> all=new ArrayList<Integer>();
		for(int j=-1;j<=(shuzu.size()-2);j++)
		{
			int sum=0;
			for(int i=j+1;(i<=shuzu.size()-1);i++)
			{
				sum=sum+shuzu.get(i);
				//System.out.println(sum);
				all.add(sum);
			}
		}
		Collections.sort(all); 
		System.out.println(all.get(all.size()-1));
	}

}

  运行结果:

 

 

 

 

反思:当数组长度超过5000且数在-1000000到2000000之间时(一种情况)程序崩溃,原因是将所有的子数组和都存到了一个集合中,然后进行排序来获取最大值,时间复杂度为O(n2),当数组长度为5000时连续的子数组个数是n为4999,2为公差,首项为1,尾为4999的等差数列的和。所以需要将时间复杂度控制在O(n),并且需要将大数加法转化为字符串来计算。

转载于:https://www.cnblogs.com/janeszj/p/10545827.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值