Testar com Array Ordenado
Nesta etapa final, exploraremos outra abordagem para encontrar duplicatas, especificamente quando o array está ordenado. Se um array estiver ordenado, os elementos duplicados estarão sempre adjacentes uns aos outros. Isso permite uma maneira muito simples e eficiente de encontrar duplicatas, simplesmente comparando elementos adjacentes.
Primeiro, vamos criar um novo arquivo Java chamado FindDuplicatesSorted.java em seu diretório ~/project.
Abra o arquivo FindDuplicatesSorted.java no Editor de Código e adicione o seguinte código Java:
import java.util.Arrays;
public class FindDuplicatesSorted {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 2, 7, 8, 8, 3};
// First, sort the array
Arrays.sort(numbers);
System.out.println("Finding duplicate elements in a sorted array:");
// Iterate through the sorted array and compare adjacent elements
for (int i = 0; i < numbers.length - 1; i++) {
// If the current element is equal to the next element, it's a duplicate
if (numbers[i] == numbers[i + 1]) {
System.out.println("Duplicate found: " + numbers[i]);
}
}
}
}
Vamos examinar as partes principais deste código:
import java.util.Arrays;: Esta linha importa a classe Arrays, que fornece métodos utilitários para arrays, incluindo a ordenação.
Arrays.sort(numbers);: Esta linha ordena o array numbers em ordem crescente.
for (int i = 0; i < numbers.length - 1; i++): Este loop itera pelo array ordenado. Iteramos até numbers.length - 1 porque estamos comparando o elemento atual (numbers[i]) com o próximo elemento (numbers[i + 1]).
if (numbers[i] == numbers[i + 1]): Esta condição verifica se o elemento atual é igual ao próximo elemento. Se forem iguais, significa que encontramos uma duplicata.
Salve o arquivo (Ctrl + S ou Cmd + S).
Agora, compile o código Java no Terminal:
javac FindDuplicatesSorted.java
Se a compilação for bem-sucedida, execute o programa:
java FindDuplicatesSorted
Você deve ver a saída listando os elementos duplicados encontrados. Observe que, como o array está ordenado, as duplicatas aparecerão consecutivamente na saída.
Este método é muito eficiente para arrays ordenados, pois requer apenas uma única passagem pelo array após a ordenação. No entanto, a etapa inicial de ordenação em si tem um custo de tempo, que depende do algoritmo de ordenação usado por Arrays.sort(). Para tipos primitivos como int, o Arrays.sort() do Java usa um quicksort de pivô duplo, que tem uma complexidade de tempo média de O(n log n).
Você agora explorou três maneiras diferentes de encontrar duplicatas em um array em Java: usando loops aninhados, usando um HashSet e usando um array ordenado. Cada método tem suas próprias compensações em termos de simplicidade, eficiência e requisitos (como o array estar ordenado). Compreender essas diferentes abordagens é valioso para escolher o método mais adequado para um determinado problema.