这次老师要求在原程序的基础上进行修改,大致有以下四个要求——数组的值从文本文件中获取;文本文件中的数字无法转换为整型,系统要能输出正确的结果;文本文件里面的数字过多,程序要能输出正确的结果;若文件不存在或路径有问题,程序要能输出正确的结果。
我选择先处理读取文本文件这个操作。我在网上搜索关于Java文本文件读取的操作。找到了按行读取文本文件并将每行的字符串变量转换为int型变量进行储存返回整型数组的函数,我便拿来用了。这样成功的将文本文件的值存入了另定义的数组中,而且数组的大小是由文本文件里面数字的个数决定的。这样便解决了第一个问题。
关于文本文件里面的字符串无法转换为整型的问题,我选择使用一个自定义的函数判断是否可以将其转换为整型,如果可以则返回true,如果抛出了相应的错误则返回false。再在将字符变量转换为整型变量的语句之前调用这个函数进行判断。同时若遇到了相应的异常,则输出相应的提示语句并使用exit退出程序。这样便解决了第二个问题。
关于文本文件里面数字过多的问题,这一个由于定义的数组大小是由文本文件大小决定的,而整型数组的容量是有限的,因此我选取了一个通过测试得到的合适的值作为界限。
关于文件名及其路径不正确的问题。我也是自定义了一个判断文件是否存在的函数,若不存在则输出相应的提示语句并退出程序。
源代码:
package 潘攀达;
import java.io.BufferedReader;
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 int[] toArrayByFileReader1(String name) {
// 使用ArrayList来存储每行读取到的字符串
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("第"+(i+1)+"行读入数字过大!!!");
System.out.println("程序已退出!");
System.exit(0);
}
array[i] = Integer.parseInt(s);
}
// 返回数组
return array;
}
public static void judeFileExists(File file) {
if (file.exists()) {
System.out.println("文件存在!");
}
else {
System.out.println("文件不存在!");
System.out.println("程序已退出!");
System.exit(0);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = toArrayByFileReader1("shuzu.txt");
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
int n=a.length;
int i,j;
int cishu;
int sum;
int max;
max=0;
cishu=0;
int geshu=((1+n)*n)/2;
if(geshu==0) {
System.out.println("文本文件为空!");
System.out.println("程序已退出!");
System.exit(0);
}
int [] daxiao=new int[geshu];
for(i=0;i<n-0;i++)
{
sum=0;
for(j=i;j<n;j++) {
sum=sum+a[j];
System.out.println("第"+(cishu+1)+"个子数组的和为:"+sum);
daxiao[cishu]=sum;
cishu++;
}
}
max=daxiao[0];
for(int l=0;l<geshu;l++) {
if(max<daxiao[l]) {
max=daxiao[l];
}
}
System.out.println("最大子数组之和为:"+max);
}
}
Main.java
以上。