Trovare il terzo numero più piccolo in Java: una guida completa

Pubblicato: 2023-08-23

Ti sei mai chiesto come trovare in modo efficiente il terzo numero più piccolo in un array, elenco o flusso di numeri interi? In questo post del blog ci immergeremo nel mondo della programmazione Java ed esploreremo diverse tecniche per identificare il terzultimo numero in varie origini dati.

Trovare il terzo numero più piccolo in Java: una guida completa

Quando si lavora con la manipolazione e l'analisi dei dati, spesso sorge la necessità di identificare elementi specifici all'interno di una raccolta di numeri. Trovare il numero più piccolo o più grande è relativamente semplice, ma determinare il terzo numero più piccolo richiede un po' più di precisione. In questo post del blog tratteremo tre metodi per affrontare questo problema utilizzando Java: ordinamento di un array, ordinamento di un elenco e utilizzo di flussi.

Metodo 1: ordinamento di un array

Gli array sono una delle strutture dati fondamentali in Java, il che li rende un punto di partenza naturale per la nostra esplorazione. L'idea qui è di ordinare l'array in ordine crescente e quindi recuperare l'elemento nell'indice 2.

Metodo 2: ordinamento di un elenco

Gli elenchi forniscono un'alternativa più flessibile agli array, consentendo il ridimensionamento dinamico e una manipolazione più semplice. Per trovare il terzo numero più piccolo in una lista, possiamo seguire un approccio simile all'ordinamento degli array.

Metodo 3: utilizzo dei flussi

I flussi Java sono un modo potente per elaborare sequenze di elementi. Possiamo utilizzare i flussi per ordinare gli elementi e quindi recuperare il terzo numero più piccolo.

Scegliere il metodo giusto

Ogni metodo ha i suoi vantaggi e casi d'uso. Se hai un array a portata di mano, il metodo di ordinamento dell'array potrebbe essere il più efficiente. Gli elenchi sono versatili e offrono maggiore comodità, mentre i flussi forniscono un approccio funzionale e possono gestire con facilità set di dati più grandi.

Ecco un esempio completo:

CrunchyThirdSmallestNumberFinder.java

 pacchetto crunchify.com.tutorial;

import java.util.Arrays;
import java.util.List;
importare java.util.stream.Collectors;
importa java.util.stream.Stream;

/**
 * @autore Crunchify.com
 * Trovare il terzo numero più piccolo in Java: una guida completa
 *
 */

classe pubblica CrunchyThirdSmallestNumberFinder {

    // Metodo per trovare il terzo numero più piccolo in un array
    public static int findCrunchyThirdSmallest(int[] crunchArr) {
        if (crunchArr.lunghezza < 3) {
            lancia una nuova IllegalArgumentException("L'array deve contenere almeno 3 elementi crunch");
        }

        // Ordina l'array croccante in ordine crescente
        Arrays.sort(crunchArr);
        return crunchArr[2]; // Restituisce il terzo elemento croccante più piccolo
    }

    // Metodo per trovare il terzo numero più piccolo in un elenco
    public static int findCrunchyThirdSmallest(List<Integer> crunchList) {
        se (crunchList.size() < 3) {
            lancia una nuova IllegalArgumentException("L'elenco deve contenere almeno 3 elementi crunch");
        }

        // Ordina l'elenco dettagliato utilizzando i flussi e raccogli gli elementi ordinati in un nuovo elenco
        Lista<Intero> sortedCrunchList = crunchList.stream()
                .smistato()
                .collect(Collectors.toList());

        restituisce sortedCrunchList.get(2); // Restituisce il terzo elemento croccante più piccolo
    }

    // Metodo per trovare il terzo numero più piccolo in un flusso
    public static int findCrunchyThirdSmallest(Stream<Integer> crunchStream) {
        // Raccogli gli elementi dal flusso croccante, ordinali e raccoglili in un elenco
        List<Integer> sortedCrunchList = crunchStream.sorted().collect(Collectors.toList());

        if (sortedCrunchList.size() < 3) {
            lancia una nuova IllegalArgumentException("Lo stream deve contenere almeno 3 elementi crunch");
        }

        restituisce sortedCrunchList.get(2); // Restituisce il terzo elemento croccante più piccolo
    }

    public static void main(String[] args) {
        int[] crunchArr = {35, 62, 28, 31, 13, 97};
        Lista<Intero> crunchList = Arrays.asList(9, 14, 676, 62, 11, 328);
        Stream<Intero> crunchStream = Stream.of(427, 53, 71, 99, 25, 62);

        // Trova i terzi numeri più piccoli utilizzando fonti diverse
        int crunchyThirdSmallestFromArr = findCrunchyThirdSmallest(crunchArr);
        int crunchyThirdSmallestFromList = findCrunchyThirdSmallest(crunchList);
        int crunchyThirdSmallestFromStream = findCrunchyThirdSmallest(crunchStream);

        // Stampa i terzi numeri più piccoli
        System.out.println("Crunchy terzo più piccolo da arr: " + crunchyThirdSmallestFromArr);
        System.out.println("Crunchy terzo più piccolo dalla lista: " + crunchyThirdSmallestFromList);
        System.out.println("Crunchy terzo più piccolo dal flusso: " + crunchyThirdSmallestFromStream);
    }
}

Risultato della console Eclipse:

Basta eseguire il programma sopra in Eclipse IDE o IntelliJ IDEA e otterrai il risultato seguente.

 Croccante terzo più piccolo da arr: 31
Croccante terzo più piccolo dalla lista: 14
Croccante terzo più piccolo dal flusso: 62

Processo terminato con codice di uscita 0

Ci sono alcune differenze prestazionali da considerare:

In termini di complessità temporale, tutti e tre i metodi hanno passaggi di ordinamento simili, che generalmente hanno una complessità temporale di O(n log n) , dove 'n' è il numero di elementi nella raccolta (array, elenco o flusso).

La complessità temporale dell'accesso al terzo elemento più piccolo è costante, O(1) , poiché si tratta di una semplice ricerca di array o elenchi.

  1. Metodo Array: questo metodo ordina l'array sul posto, quindi non richiede memoria aggiuntiva per una nuova raccolta ordinata. Ciò può portare a un utilizzo della memoria leggermente migliore rispetto ai metodi list e stream.
  2. Metodo elenco: questo metodo converte l'elenco in un elenco ordinato utilizzando i flussi. Sebbene sia conveniente, comporta la creazione di un nuovo elenco, che consuma memoria aggiuntiva. Questo può essere un problema se l'utilizzo della memoria è cruciale.
  3. Metodo stream: il metodo stream è abbastanza flessibile e funzionale, ma prevede la raccolta dello stream in un elenco. Ciò aggiunge un piccolo sovraccarico in termini di memoria ed elaborazione rispetto all'ordinamento diretto dell'array.

Fammi sapere se riscontri problemi con l'esecuzione di questo codice.