该程序是为用户输入一系列数字而设计的,直到用户输入我设置为0的哨兵。用户输入哨兵后,该程序应打印最高数字和第二高该列表中的数字。我遇到的麻烦是我希望第二个最高的数字是打印0而不是。
使用?:运算符是否有更优雅的方法来解决这个问题?可能吗?
import acm.program.*;
public class LargestAndSecondLargest extends ConsoleProgram {
public void run() {
int a = 0;
int b = 0;
while (true) {
int value = readInt(" ?: ");
if (value == SENTINEL) break;
if (value > a) {
a = value;
}
else if (value > b) {
b = value;
}
}
println("the largest value is " + a);
println("the second largest number is" + b);
}
private static final int SENTINEL = 0;
}
答案 0 :(得分:2)
有两个问题:
答案 1 :(得分:1)
else if ( b > value )
以上其他条件应为: -
else if ( value > b )
否则,如果您只输入b
个号码,则positive
永远不会更改,因此2nd
最大值将为0
。
另见@ NPE的answer中的第二个要求,这是必需的。
答案 2 :(得分:0)
将值插入数组中。对数组进行排序,然后将数组中的前两个值分配到输出中。如果只根据要求给出一个值,则将它们设置为相同的值或将其设置为0。
答案 3 :(得分:0)
这是我的解决方案(你可以适应你的超类):
public class LargeAndSecondLargest {
public static void main(String[] args) {
new LargeAndSecondLargest().run("1 2 2");
}
public void run(String input) {
final int SENTINEL = 0;
int currVal;
Scanner scanner = new Scanner(input);
List<Integer> numbers = new ArrayList<>();
while (scanner.hasNextInt() && ((currVal = scanner.nextInt()) != SENTINEL)) {
numbers.add(currVal);
}
printFirstAndSecondLargest(numbers);
}
private void printFirstAndSecondLargest(List<Integer> numbers) {
Collections.sort(numbers, Collections.reverseOrder());
System.out.println("the largest value is " + numbers.get(0));
System.out.println("the second largest number is " + numbers.get(1));
}
}