编写一个名为
plusScores的静态方法,该方法接受包含一系列表示学生记录的行的扫描器作为参数。每个学生的记录需要两行输入。第一行有学生的名字,第二行有一系列的正负字符。下面是一个示例输入:凯恩,埃丽卡-+-+钱德勒,亚当++-+马丁,杰克+++++++狄龙,阿曼达+-+-++对于每个学生,您应该生成一行输出,其中包含学生的名字,后面是冒号,后面是加号字符的百分比。例如,如果上面的输入存储在一个名为input的扫描仪中,那么plusScores(输入)的调用应该产生以下输出:凯恩、埃丽卡: 40.0% +钱德勒、亚当: 75.0% +马丁、杰克: 100.0% +狄龙、阿曼达: 62.5% +
我正在寻找解决这个问题的替代方法,当然,我的代码可能存在任何潜在的错误或缺陷。如果你有什么有趣的事情要分享,请做!我对编程很陌生,我渴望看到其他解决问题的方法,比如这个问题。这是我的密码:
public static void plusScores(Scanner sc) {
while (sc.hasNextLine()) {
String line = sc.nextLine();
if (!line.startsWith("+") && !line.startsWith("-")) {
System.out.print(line);
} else {
int plus = 0;
int minus = 0;
for (char ch : line.toCharArray()) {
if (ch == '+') {
plus++;
} else {
minus++;
}
}
float percentPlus = ((float) (plus) / (plus + minus)) * 100;
System.out.format(": %.1f%% plus\n", percentPlus);
}
}
}发布于 2018-01-18 13:30:06
您的方法基本上是正确的,但它有包含整个逻辑的谬误,没有给流程、变量等提供有意义的名称/解释--一个更健壮、可扩展、清晰和可维护的解决方案是用最终变量替换所有常量,并将小问题域封装到它们自己的方法中。特别代表:
public static final String PLUS = "+";
public static final String MINUS = "-";
...
if (isStudentNameLine(line)) {
processStudentNameLine(line);
} else {
...
private static boolean isStudentNameLine(String line) {
return !line.startsWith(PLUS) && !line.startsWith(MINUS);
}
private static void processStudentNameLine(String line) {
System.out.print(line);
}如果用方法替换一行代码,这似乎是过分的做法。这种方法有许多优点:
发布于 2018-01-18 13:15:14
您的方法大部分是正确的,但它似乎是写得太具体,无法解决问题,正如所述。
例如,您假设任何不以正数或减号开头的行都是包含学生姓名的行。
举个例子:如果一个学生没有得利,那该怎么办?这种情况不会像前面提到的那样发生,但是您通常不会得到这样的“已经处理了”,而且它只是帮助编程的方式,以一种轻微偏离正常的输入仍然可以优雅地处理。
你也在假设,当你计算正数和负数时,所有不是正数的东西都是负数。
就目前而言,这是可行的。但是,如果需要改变评分机制,您可能需要采用一种更灵活的方法--例如,将I/O和计数分离开来。
https://codereview.stackexchange.com/questions/185385
复制相似问题