Java 需要帮助写一个程序,找到最高和第二高的数字是一个系列

Java 需要帮助写一个程序,找到最高和第二高的数字是一个系列,java,Java,该程序是为用户输入一系列数字而设计的,直到用户输入我设置为0的哨兵。用户输入sentinel后,程序应该打印列表中的最高数字和第二高数字。我遇到的问题是,我希望第二高的数字是0 有没有更优雅的方法通过使用?:操作符来解决这个问题?可能吗 import acm.program.*; public class LargestAndSecondLargest extends ConsoleProgram { public void run() { int a = 0;

该程序是为用户输入一系列数字而设计的,直到用户输入我设置为0的哨兵。用户输入sentinel后,程序应该打印列表中的最高数字和第二高数字。我遇到的问题是,我希望第二高的数字是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。

有两个问题:

  • 第二个比较是错误的
  • 当您遇到一个新的最高编号时,您需要将以前的最高编号移动到第二高的插槽中。否则,序列1、2、3将产生3和1作为两个最高的数字
  • 这里是我的解决方案(您可以适应您的超类):

    公共类大和次大{
    公共静态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));
        }
    }