Java 打印数组中最高的两个数字

Java 打印数组中最高的两个数字,java,arrays,Java,Arrays,所以我创建了一个名为max2的方法,该方法应该返回数组中的两个最高值。我能够返回最高的值,但是我不知道如何返回第二高的值 这是我的密码: 主要方法 public static void main(String[] args) { Integer intArray[] = { 13, 25, 46, 65, 12, 23}; Double doubleArray[] = {1.2, 3.4, 1.1, 0.1, 5.6}; String st

所以我创建了一个名为max2的方法,该方法应该返回数组中的两个最高值。我能够返回最高的值,但是我不知道如何返回第二高的值

这是我的密码: 主要方法

    public static void main(String[] args) {
        Integer intArray[] = { 13, 25, 46, 65, 12, 23};
        Double doubleArray[] = {1.2, 3.4, 1.1, 0.1, 5.6};
        String stringArray[] = {"H", "E", "L", "L", "O"};

    System.out.println("The smallest number is: " + myMin(doubleArray));
    System.out.println("The median is: " + median(doubleArray));
    System.out.println("The median is: " + median(stringArray));
    System.out.println("The max is: " + max2(intArray));
}
我的max2方法:

public static <E extends Comparable<E>> E max2(E... elements) {

Arrays.sort(elements);

    E max = elements[0];
    for (E element : elements) {
        if (element.compareTo(max) > 0) {
            max = element;

        }
    }
    return max;

}
publicstaticemax2(E…元素){
数组。排序(元素);
E max=元素[0];
对于(E元素:元素){
如果(元素比较(最大值)>0){
最大值=元素;
}
}
返回最大值;
}

我想知道是否有办法获得数组的倒数第二个索引。理想情况下,我希望它能与任何阵列一起工作。我期待着被指向正确的方向。谢谢您的帮助。

您可以使用Java 8 streams删除重复项并对数组进行排序,还可以使用
length-1
length-2
从数组中获取max和second max元素

Integer intArray[] = { 13,13, 25, 46,25, 65, 12, 23};
    Double doubleArray[] = {1.2, 3.4, 1.1, 0.1, 5.6};
    String stringArray[] = {"H", "E", "L", "L", "O"};

   Integer[] s= Arrays.stream(intArray).sorted().distinct().toArray(Integer[]::new);
   System.out.println(Arrays.toString(s));
   int max = s[s.length-1];
   int max2 = s[s.length-2];
或者,如果您只想对数组进行排序,那么应该使用
Arrays.sort
对数组进行排序,并获得max和second max元素

Arrays.sort(intArray) 
int max = s[s.length-1];
int max2 = s[s.length-2];

我们需要按降序对数组进行排序,您可以使用气泡排序,现在我们可以得到最后一个索引值作为最高数,第二个索引作为第二个最高数。 例如

类返回两个最高数{
公共静态void main(字符串…参数){
int arr[]={12,13,15,6,9,30,50,19};
ReturnTwoHeightNumber=新ReturnTwoHeightNumber();
编号:bubleSort(arr);
数字。printTwohighestNumber(arr)
}
void bubleSort(int arr[]){
int n=阵列长度;
对于(int i=0;jj)您的方法
你目前的方法没有多大意义。你有

Arrays.sort(elements);

E max = elements[0];
for (E element : elements) {
    if (element.compareTo(max) > 0) {
        max = element;
    }
}
return max;
也就是说,您首先对数组进行排序。然后遍历所有元素以查找max元素。首先,您希望查找第二个to max元素,而不是max元素。其次,当您不利用排序的事实,而只是遍历数组时,为什么要进行排序

让我给你看看一些解决办法


全排序 最简单的解决方案可能是执行完全排序,然后访问倒数第二个元素(默认情况下,元素按升序排序):

这种方法有一个问题。
array.sort
以内联方式对给定数组进行排序。也就是说,它会更改您的输入数组。您可能不希望这样做,而只希望对副本进行排序。因此:

E[] copyValues = values.clone();
Arrays.sort(copyValues);
return copyValues[copyValues.length - 2];

部分排序 您可以始终执行部分排序(k排序),而不是执行完全排序。这将更快,因为您只需要对数组按2个元素降序排序。您可以使用
PriorityQueue
进行部分排序。将所有元素插入队列,然后调用
poll
两次。队列始终根据顺序为您提供下一个元素

PriorityQueue<E> queue = new PriorityQueue<>(Comparator.reverseOrder());
queue.addAll(Arrays.asList(values);

queue.poll(); // Greatest element
return queue.poll(); // Second to greatest element

请注意,您还需要记住
max
元素,因为您希望找到一个不大于
max
但仍大于其余元素的元素。

在遍历时,您需要同时记住这两个元素,不仅要记住最高的候选元素,还要记住第二高的候选元素。或者,对数组排序并选择second元素。或者进行2排序(k排序)。或者使用您的方法识别最高的元素,将其删除,然后再次识别最高的元素。
数组。排序(元素);
-默认情况下,数字按升序排序。
元素[0]
不是最大的元素,而是最小的元素。最大的元素是
元素[elements.length-1]
第二大元素是
元素[elements.length-2]
。请进行一些调试,只需在代码中添加一些
System.out.println(…)
,以检查它。您可以很容易地自己发现。好的,这很有意义!谢谢!并且澄清一下,如果我删除了该元素(最高的元素)我可以重做我已经做过的,并返回第二大的正确值?您可以从中删除元素array@Deadpool如何从数组中删除元素?请注意,获取第二大元素不需要完全排序。
E[] copyValues = values.clone();
Arrays.sort(copyValues);
return copyValues[copyValues.length - 2];
PriorityQueue<E> queue = new PriorityQueue<>(Comparator.reverseOrder());
queue.addAll(Arrays.asList(values);

queue.poll(); // Greatest element
return queue.poll(); // Second to greatest element
E max = values[0];
E secondMax = values[0];

for (E element : elements) {
    if (element.compareTo(max) > 0) {
        secondMax = max;
        max = element;
    } else if (element.compareTo(secondMax) > 0) {
        secondMax = element;
    }
}

return secondMax;