Java 需要帮助写一个程序,找到最高和第二高的数字是一个系列
该程序是为用户输入一系列数字而设计的,直到用户输入我设置为0的哨兵。用户输入sentinel后,程序应该打印列表中的最高数字和第二高数字。我遇到的问题是,我希望第二高的数字是0Java 需要帮助写一个程序,找到最高和第二高的数字是一个系列,java,Java,该程序是为用户输入一系列数字而设计的,直到用户输入我设置为0的哨兵。用户输入sentinel后,程序应该打印列表中的最高数字和第二高数字。我遇到的问题是,我希望第二高的数字是0 有没有更优雅的方法通过使用?:操作符来解决这个问题?可能吗 import acm.program.*; public class LargestAndSecondLargest extends ConsoleProgram { public void run() { int a = 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;
}
上述else if条件应为:-
else if ( value > b )
否则,如果您只输入正数
,您的b
将永远不会更改,因此2次
最大值将为0
另请参见@NPE中必要的第二项要求。将值插入数组。对数组进行排序,然后将数组中前两个值分配到输出中。如果根据要求只给出一个值,则将它们都设置为相同的值或一到0。有两个问题:
公共类大和次大{
公共静态void main(字符串[]args){
new largeandsecondmagnet().run(“12”);
}
公共无效运行(字符串输入){
最终int SENTINEL=0;
国际货币;
扫描仪=新扫描仪(输入);
列表编号=新的ArrayList();
while(scanner.hasNextInt()&&((currVal=scanner.nextInt())!=SENTINEL)){
数字。添加(currVal);
}
打印第一和第二大(数字);
}
private void PrintFirst和Second最大(列表编号){
Collections.sort(数字,Collections.reverseOrder());
System.out.println(“最大值为”+numbers.get(0));
System.out.println(“第二大数字是”+numbers.get(1));
}
}
按降序排序。先选。选择第二个。(除非这是家庭作业或有其他限制。也可以使用升序排序,并选择倒数第二/倒数第二,这在Java中通常更容易,因为缺少..“更高的功能”。@pst。。排序不会比OP当前使用的方式更有效。@pst:什么样的“更高的功能”会使选择最后一个元素比选择第一个元素更容易?只是好奇而已。@thedanhofs尤其如此-在Java中搜索整数列表的反向排序(然后是数组和其他集合)。在Scala、Python、Ruby、C#等语言中,通常可以轻松指定自定义比较器(即lambda)进行排序。@RohitJain有“高效”和“高效利用我的时间”;在这种情况下,除非它是一个长的流-这是一个有效的反例-我不会三思而后行。我选择后者,除非有理由选择前者。我从Knuth对97/3的观察开始。。但不知何故,我还是觉得自己做得太多了:-/我只是试了一下,效果不错。谢谢。是否可以使用?:运算符?@JessicaM解决此问题。。。不,使用?:
运算符将无法实现。它无法处理第二高的数字。这会起作用,但具有不必要的高内存和时间复杂性。谢谢。我明白你的意思,但我不明白怎么做。你能给我举个例子吗?@JessicaMif(value>a){b=a;a=value;}否则if(value>b){b=value;}@Tom谢谢。它确实澄清了我遇到的许多问题。下面的输入如何:12
?我希望输出是22
@NPE这是正常的,因为TreeSet
中不允许重复。
else if ( value > b )
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));
}
}