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


    设计思路:首先要实现随机生成一个范围内的整数写入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),并且需要将大数加法转化为字符串来计算。

  • 相关阅读:
    Redis3.0.1 Stable版本的集群部署(Mac)
    Maven的包依赖冲突可引发java.lang.IncompatibleClassChangeError错误
    Key/Value存储系统etcd的特性
    实时消息平台NSQ的特性
    StringIO函数
    对文件内容进行迭代
    基本文件方法
    打开文件
    正则表达式知识点汇总
    编译
  • 原文地址:https://www.cnblogs.com/janeszj/p/10545827.html
Copyright © 2020-2023  润新知