在数组 java 中找到第三大数(包括重复项)

find third largest number in array java(including duplicates)

这个问题可能已经回答了,但我的问题是,如果我在给定数组中传递重复或重复的值,那么它会给出错误的输出。按照逻辑应该给出正确的值,但不确定我的代码有什么问题。下面是我的代码

import java.util.Scanner;
import java.util.Arrays;  

class ThirdLargest{

   static int thirdLar(int arr[],int arr_size)
   {
            int i, largest, secondLargest, thirdLargest; 


        thirdLargest = largest = secondLargest = Integer.MIN_VALUE; 
        for (i = 0; i < arr_size ; i ++) 
        { 
            /* If current element is smaller than 
            largest*/
            if (arr[i] > largest) 
            { 
                thirdLargest = secondLargest; 
                secondLargest = largest; 
                largest = arr[i]; 
            } 

            /* If arr[i] is in between largest and 
            secondLargest then update secondLargest */
            else if (arr[i] > secondLargest) 
            { 
                thirdLargest = secondLargest; 
                secondLargest = arr[i]; 
            } 

            else if (arr[i] > thirdLargest) 
                thirdLargest = arr[i]; 
        }  
        return thirdLargest;
    }  

    public static void main(String args[]){

      //Scanner object for capturing the user input
      Scanner scanner = new Scanner(System.in);


      //Stored the entered value in variable

        /*System.out.print("Enter 5 number of elements:");
        int n = scanner.nextInt();*/
        int n = 5;
        int arr[] = new int[n];
        System.out.println("Enter 5 numbers one by one:");
        for(int i = 0; i < n; i++)
        {
            arr[i] = scanner.nextInt();
        }

      //Call thirdLar method to find largest number among given numbers
      int thirdLarNum = thirdLar(arr,n);
      System.out.println("The Third Largest Number is: "+thirdLarNum);
   }
}

输出:如果我传递像 10 20 40 20 20 这样的值 正确的输出应该是 10 但它返回 20

要确保 largestsecondLargestthirdLargest 是唯一的,您应该添加更多检查:

        ...
        else if (arr[i] > secondLargest && arr[i] != largest) 
                                        --------------------
        { 
            thirdLargest = secondLargest; 
            secondLargest = arr[i]; 
        } 

        else if (arr[i] > thirdLargest && arr[i] != largest && arr[i] != secondLargest) 
                                       -----------------------------------------------
            thirdLargest = arr[i]; 
        ...

可以用Set代替数组来剔除重复值转成数组

Set<int> set = new HashSet<>();

for(int i = 0; i < n; i++)
{
    set.add(scanner.nextInt());
}

int thirdLarNum = thirdLar(set.toArray(), n);

或者在thirdLar中使用set代替数组

static int thirdLar(Set<int> set)
{
    for (int number : set) {
        if (number  > largest) {
            //...
        }
    }
}

我们可以使用下面的代码来实现。

int[] a = {1,10,33,55};
List<Integer> list=Arrays.asList(a); 
int total = list.size; 
Collections.sort(list);  
int element=list.get(total-3);

您可以使用 Streams :

我在这里使用了一个 IntStream,它不支持排序中的比较器,它可以允许 Collections.reverseSort(),所以我必须在比较之前对每个 int 取反 – 而 return 取反的值;

import java.util.Arrays;

public class Main {

    static int thirdLar(final int[] arr) {

        final int[] array = Arrays.stream(arr).map(i -> -i).sorted().distinct().limit(3).toArray();

        return -array[Math.min(2, array.length - 1)];
    }

    public static void main(final String args[]) {

        System.out.println(thirdLar(new int[] { 1, 5, 2, 5, 10, 2, 2, 5, 10, 12, 25, 1, 5 }));

    }
}

Edit :此代码可以轻松找到第 n 个最大的

import java.util.Arrays;

public class Main {

    static int nthLargest(final int[] arr, final int rank) {

        assert rank > 0;

        final int[] array = Arrays.stream(arr).map(i -> -i).sorted().distinct().limit(rank).toArray();

        return -array[Math.min(rank - 1, array.length - 1)];
    }

    public static void main(final String args[]) {

        System.out.println(nthLargest(new int[] { 1, 5, 2, 5, 10, 2, 2, 5, 10, 12, 25, 1, 5 }), 3);

    }
}