背景
近日在补充java有关知识,今天上课时老师留了一道课堂练习,做完后有感而发,以下是有关 specification and robustness 的一些拙见。
题目很简单,主要有两个要求:两个数组一个存成绩,另一个存权重后计算加权平均,如何判断输入是否合法?
自身实践
这是我课堂例题练习的代码:
import java.util.Scanner;
public class practice001 {
public static void main(String[] args) {
Scanner myscanner = new Scanner(System.in);
double[] array1;
double[] array2;
do {
System.out.println("请输入第一个数组的元素(用空格分隔):");
array1 = readArray(myscanner);
System.out.println("请输入第二个数组的元素(用空格分隔):");
array2 = readArray(myscanner);
} while (!isConditionMet(array1, array2));
System.out.println("条件满足,可以继续执行其余操作");
//......
}
public static double[] readArray(Scanner myscanner) {
String input = myscanner.nextLine();
String[] parts = input.split(" ");
double[] array = new double[parts.length];
for (int i = 0; i < parts.length; i++) {
array[i] = Double.parseDouble(parts[i]);
}
return array;
}
public static boolean isConditionMet(double[] array1, double[] array2) {
double sum = 0;
if(array1.length!=array2.length){
System.out.println("二者数量不相等,请重新输入数组:");
return false;
}
else{
for (int i = 0; i < array2.length; i++) {
sum += array2[i] ;
}if (sum == 1) {
return true;
}
}
System.out.println("每项占比之和不满足100%,请重新输入数组:");
return false;
}
}
技术名词解释
在此程序中采取了do while循环,isConditionMet用来判断,直到条件满足,才可进行接下来的代码。对于数组的读入代码,加过注释后如下所示:
public static double[] readArray(Scanner myscanner) {
// 从键盘输入获取一行字符串
String input = myscanner.nextLine();
// 将输入的字符串按空格分割成数组元素
String[] parts = input.split(" ");
// 创建一个整数数组,大小为输入的字符串数组的长度
double[] array = new double[parts.length];
// 遍历字符串数组中的每个元素
for (int i = 0; i < parts.length; i++) {
array[i] = Double.parseDouble(parts[i]);
}
// 返回存储输入数组
return array;
}
技术细节
1.split() :
input.split() 是 Java 中字符串类(String)的一个方法,它的作用是将字符串按照指定的分隔符进行分割,并返回一个字符串数组。
具体来说,split() 方法接收一个字符串参数,这个参数是一个正则表达式,用来描述分隔符的规则。方法会根据这个规则将原始字符串分割成多个子串,并将这些子串存储到一个字符串数组中。
例如:
字符串 input = “hello world”,然后调用 input.split(" "),它将使用空格作为分隔符,将字符串分割成 “hello” 和 “world” 两个子串,并存储到一个字符串数组中,然后返回这个数组。
使用逗号或空格分隔的例子:
public class Main {
public static void main(String[] args) {
String str = "apple,banana orange";
String[] parts = str.split("[,\\s]+");
// 打印拆分后的部分
for (String part : parts) {
System.out.println(part);
}
}
}
2.Double.parseDouble(parts[i]):
Double.parseDouble(parts[i]);是 Java 中的一个方法调用,用于将字符串转换为Double类型。在这个上下文中,它是将字符串数组 parts 中的每个元素(字符串)转换为Double类型。
具体来说,Double.parseDouble();是一个静态方法,它接受一个字符串作为参数,并尝试将这个字符串解析为一个Double。如果解析成功,就返回对应的整数值;如果解析失败(例如字符串不是一个合法的整数表示),就会抛出一个 NumberFormatException 异常。
例如,假设 parts[i] 是一个字符串 “123.5”,调用 Double.parseDouble(parts[i]); 将返回Double 123.5。如果 parts[i] 是一个非法的Double表示,比如 “abc”,那么调用Double.parseDouble(parts[i]); 将抛出 NumberFormatException 异常。
在上述代码中,Double.parseDouble(parts[i]); 用于将从键盘输入的字符串转换为Double,这样就可以将用户输入的数组元素存储到数组中。
感悟
作为一名软工的学生,在日常做作业、做项目中我们总会遇到各种各样的要求和条件即为specification,如何解决好这些问题。我想这需要我们跳出来看待这些问题,也需要我们设身处地的为用户考虑。通过本次练习我了解了尽可能满足specification and robustness的困难之处。此代码的robustness还很欠缺,需要我长期以往的改进和维护。因此我意识到,尽可能满足用户提的要求尤为考验我们自身实力。我们需要提升自己思考问题的方式,并且更周全、细致的考虑一切可能的结果,不要让“一位程序员走进酒吧,然后点了一份炒饭,酒吧就爆炸了”的事情再次发生。这需要我们的代码具有极强的robustness和我们在测试中尽可能的对自己的代码狠一些。今天课上有一句话很触动我:永远不要把你的那堆“破烂”当宝贝,要对他们狠一些,越早出问题越好。(ps:这是我第一篇blog,有不足之处还请大家见谅)