软件构造LAB1思考-MagicSquare

Java中从文件中读取数据的类有非常多,不同的Java版本也不尽相同,实验要求的版本为Java11,可以用BufferedReader来分行读取文件,readline读入每行字符串,再用string类中的方法对字符串进行分割,就可以得到若干单独的数字字符,再用Integer类中的解析方法就可以得到确切的整型数,再读入我们声明的矩阵即可。

以下是从文件中读取整型数矩阵的方法,可供参考:
public static void main(String[] args) throws IOException {

BufferedReader bf = new BufferedReader(new FileReader("src/P1/txt/"+fileName));
String textLine = new String();
String str = new String();
while((textLine = bf.readLine()) != null) {//readline每次读取一行,也是最推荐的读取文件的方法
str += textLine + ",";//由于读取的是矩阵,每读取一行就用逗号隔开
}//以上都是固定操作,为把filename里面的文件一行一行读入str中,每行用逗号隔开
String[] numbers = str.split(",");//这里是根据逗号把每行分别存入numbers中,这一步其实可以直接在上面的while里实现,但是这样更详细操作空间更大
int[][] number = new int[numbers.length][numbers.length];//矩阵数组
String[] stmp = null;
for(int i = 0; i < numbers.length; i++) {
stmp = numbers[i].split("\t");//这里其实是把每一行的数字进一步分离
for(int j = 0; j < numbers.length; j++) {
number[i][j] = Integer.valueOf(stmp[j]);//这里Integer.parseInt这个函数是把字符串解析成整数
}
}
bf.close();//**一定要记得关闭文件**
return number;
}

在编写程序时,可以使用以下语句声明一个以一维数组为元素的List:

List<Integer[]> list=new ArrayList<Integer[]>();

这样处理的好处是可以很方便的利用List中的操作来分行对矩阵进行更新,还可以方便地检测每一行元素数量不同。(***钻的测试文件里有一项就是大得不得了的矩阵的倒数第二行阴险地少了一个元素,这个问题用普通的二维数组来处理还挺麻烦的)代码如下:

Integer[] iarray = new Integer[array.length];
for (String strs : array) {
if (strs != null)
iarray[s++] = Integer.parseInt(strs);
}
n = array.length;
list.add(iarray);
if (row > 1) {
if (list.get(row - 1).length != list.get(row - 2).length) {
System.out.println("this is not a square!不是正方形");
bf.close();
fp.close();
return false;
}

最后检查每行每列的元素和是否相同可以设置两个一维数组xsum和ysum,xsum[i]存储第i行的元素和,ysum[j]存储第j列的元素和,数组初始化为0。当遍历到一个矩阵第i行第j列的一个元素时,就把它加入到对应的数组位置中,这个思路非常方便。

posted @ 2022-05-13 16:26  DDDaily  阅读(31)  评论(0编辑  收藏  举报