Java实验——输出一个数组里面连续子数组最大的和(二)文件操作
在本周的练习中,主要是对上周的实验进行健壮性的完善,即在所能考虑到的情况之中,尽量使自己的程序能够正常地运行。
在上周的实验中,我已经是在编程过程中考虑到用户输入的错误类型的问题,所以这一方面并没有多大的阻碍,最大的问题是没有考虑到数值的大小对最终结果的影响,所定义的存储和的变量用的是int型,这样导致了如果输入的结果过大的话,就可能导致变量的值溢出的情况,根据系统库中提供的biginteger类,提供了大数整型的处理,所以只需要对其中的int类型修改成相应的biginteger操作即可。
然后在本次练习之中要求:要对文件里面的内容进行读取再进行操作。由于考虑到健壮性,我决定在遇到类似于字符这一类数据的情况就对文件停止读取操作,根据正则表达式对其进行判断。并输出相应的错误原因。
根据上面的实现思想,我根据上周的代码修改写出了以下的代码:
package lainxu; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.math.BigInteger;
import java.util.List;
//import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class ShowM { //static Scanner it=new Scanner(System.in);
static List<BigInteger> nums=new ArrayList<BigInteger>(); //用于储存数组
public static void main(String[] args) throws IOException {
// TODO 自动生成的方法存根 List<BigInteger> max=new ArrayList<BigInteger>(); int maxp=-1; //储存从1开始的子组和最大值的位置
daochu();
if(!daoru())
{
System.out.print("数据导入失败");
return;
}
else System.out.print("数据导入成功"); //int num=0;
//手动输入区域
//--------------------------------------------
// System.out.println("请输入你想要查找数组的长度:");
// while(num<=0) //实现用户输入数组的大小
// {
// if(it.hasNextInt())
// {
// num=it.nextInt();
// if(num<=0)
// {
// System.out.println("输入数组不能小于等于0,请重新输入");
// }
//
// }
// else
// {
// it.next();
// System.out.println("输入格式错误,请重新输入");
// }
// }
//-------------------------------------------- max.add(new BigInteger("0")); //添加一个max使其为0
for(int i=1;i<=nums.size();i++) //储存数组
{
//--------------------------------------------
//手动输入区域
//System.out.println("请输入第"+i+"个数:");
BigInteger g_down=null; // while(g_down==null)
// {
// if(it.hasNextInt())
// {
g_down=nums.get(i-1); max.add(g_down.add(max.get(i-1)));
//nums.add(g_down); // }
// else
// {
// it.next();
// System.out.println("输入格式错误,请重新输入");
// }
// }
//-------------------------------------------- } System.out.println("输入的数组是"+nums.toString()); BigInteger minn=max.get(0);
int minp=0;
BigInteger remax=max.get(1);
maxp=0;
for(int i=1;i<max.size();i++)
{
List<BigInteger> max2=max.subList(0, i);
BigInteger g_min=min(max2);
if(max.get(i).subtract(g_min).compareTo(remax)==1)
{
remax=max.get(i).subtract(g_min);
maxp=i-1;
minp=max.indexOf(g_min);
}
} System.out.println("最大子数组和为是"+(remax.subtract(minn))+",位置为("+(minp+1)+","+(maxp+1)+")"); //it.close();
}
public static void daochu() throws IOException
{
File a=new File("suzu.txt");
FileOutputStream b = new FileOutputStream(a);
OutputStreamWriter c=new OutputStreamWriter(b,"UTF-8");
for(int i=0;i<10000;i++)
{
int g_down=(int) (Math.random()*2000000000);
if((int) (Math.random()*2)==0)
{
g_down=-g_down;
}
if(i==0)
c.append(g_down+"");
else c.append(" "+g_down); }
c.close();
b.close();
}
public static BigInteger min(List<BigInteger> max)
{
BigInteger g_min=max.get(0);
for(BigInteger it:max)
{
if(g_min.compareTo(it)==1)
{
g_min=it;
}
}
return g_min;
}
public static String change(String i)
{
if(i==null||i.equals(""))
return null;
else if(i.contains("-"))
return i.replace("-", "");
else return "-"+i;
}
//----导入测试
@SuppressWarnings("resource")
public static boolean daoru() throws IOException
{ File a=new File("suzu.txt");
if(!judeFileExists(a))
{
System.out.println("文件不存在");
return false;
}
FileInputStream b = new FileInputStream(a);
InputStreamReader c=new InputStreamReader(b,"UTF-8");
{
BufferedReader bufr =new BufferedReader(c);
String line = null;
while((line = bufr.readLine())!=null){
String ook[]=line.split(" ");
for(String it:ook)
{
if(!isNumeric(it))
{
System.out.println("出现错误类型的数组,不能继续执行程序");
return false;
}
else
{
nums.add(new BigInteger(it));
}
} }
bufr.close();
}
c.close();
b.close();
return true;
}
//文件判断是否存在
public static boolean judeFileExists(File file) { if (file.exists()) {
return true;
} else {
return false;
} }
//判断纯数字
public static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("-?[0-9]*");
if(str==null||str.equals(""))
return false;
Matcher isNum = pattern.matcher(str);
if (!isNum.matches()) {
return false;
}
return true;
} }
接下来是对文件中9w个数的数组进行求最大子集和的结果:(16GB RAM,Window10 64位系统,i7 7700Hq下耗时半分钟之内)

这是文件里面的数据

测试其健壮性,在文件中9w条数据的任意位置插入任意错误的数据试试:

输出结果如下,能考虑到的健壮性没问题(没有文件的测试下也没有问题):


Java实验——输出一个数组里面连续子数组最大的和(二)文件操作的更多相关文章
- Task 4 求数组的连续子数组的最大和(团队合作)
小组成员:李敏.刘子晗 1.设计思想:由于已经做过这个题目,只要对之前的程序加上相应的测试和约束即可.我们两个人一起商议后,决定了程序的主框架和并列出了最终可以实现的功能.先要定义数组长度和上下限的变 ...
- lintcode循环数组之连续子数组求和
v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. ...
- Java实现 LeetCode 581 最短无序连续子数组(从两遍搜索找两个指针)
581. 最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: ...
- 【Java】 剑指offer(42) 连续子数组的最大和
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整/ ...
- 【Java】 剑指offer(44) 连续子数组的最大和
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 数字以0123456789101112131415…的格式序列化到 ...
- Dp解决数组中连续子数组的最大和
#include<iostream> ]; ;i<size;i++) { TempSum = CurSum; ) ...
- 求数组的相邻子数组的最大值(txt文件存储)
package mypackage; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...
- lintcode :continuous subarray sum 连续子数组之和
题目 连续子数组求和 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.(如果两个相同的答案,请返回其中任意一个) 样例 给定 [-3, ...
- 最大连续子数组问题2-homework-02
1) 一维数组最大连续子数组 如第homework-01就是一维数组的最大子数组,而当其首位相接时,只需多考虑子数组穿过相接的那个数就行了! 2)二维数组 算法应该和第一次的相似,或者说是将二维转化为 ...
随机推荐
- LR 两种录制:html与url
一直在使用LR,对于Html_based script和Url-based script 两种录制方式之间,要如何选择,仍是一知半解.最近测试时遇到同样的业务功能,两种录制方式的脚本,单次执行时间差别 ...
- fork后子进程从哪里开始执行
子进程和父进程都从调用fork函数的下一条语句开始执行
- DECLARE - 定义一个游标
SYNOPSIS DECLARE name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ] CURSOR [ { WITH | WITHOUT } HOLD ...
- Bug的分类和管理流程
1.按照严重程度划分 定义:是指Bug对软件质量的破坏程度,即BUG的存在将对软件的功能和性能产生怎样的影响 分类:系统崩溃.严重.一般.次要.建议 2.按优先级划分 定义:表示处理和修正软件缺陷的现 ...
- Vsphere中ESXi主机ssh开启的三种方法
ESXi 5.5是直接安装在物理主机上的一个虚拟机系统,本质上是一个Linux系统. 平时可以通过VMware Client端或者VMware vCenter进行管理,但对于一些特殊的VMware命令 ...
- Windows 7桌面显示图标窗口句柄的获取
在windows XP时代,我们获取桌面图标窗口的句柄往往用一下语句: HWND hwndParent = ::FindWindow( "Progman", "Progr ...
- 两个乒乓球队进行比赛,各出三人。 甲队为a,b,c三人,乙队为x,y,z三人。 已抽签决定比赛名单。 有人向队员打听比赛的名单。 a说他不和x比,c说他不和x,z比, 请编程序找出三队赛手的名单。
题目:两个乒乓球队进行比赛,各出三人. 甲队为a,b,c三人,乙队为x,y,z三人. 已抽签决定比赛名单. 有人向队员打听比赛的名单. a说他不和x比,c说他不和x,z比, 请编程序找出三队赛手的名单 ...
- C指针与数组之间的细节
看以下代码: #include <stdio.h> void f(char**); int main() { char *argv[] = { "ab", " ...
- 2018美赛准备之路——Matlab基础——命令行功能函数
clc 清屏(只清除显示内容) clear 清除所有变量(运算结果) who 显示workspace的所有变量 whos 详细显示workspace的所有变量 help sin 显示sin函数 ...
- 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?
1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ...