题目: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;
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 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);//输出最大的子数组和
}
}
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循环。