4 способи знайти дублікати в Java List
Джерело: Codippa У цій статті розглянуто різні способи пошуку дублікатів у List. Дублікатами ми називаємо елементи, які зустрічаються більше одного разу.1. Використання Set
Нижче наведено алгоритм способу пошуку повторюваних елементів Java List з використанням Set .- Створюємо новий об'єкт Java Set і новий ArrayList для зберігання елементів, що повторюються.
- Виконуємо ітерацію чи цикл за списком.
- Кожен елемент у списку додаємо в Set , використовуючи метод add() .
- В результаті add() повертає true якщо елемент доданий, і false якщо елемент вже був присутній в Set .
- Якщо елемент вже є в Set , він є дублікатом. Тоді ми додаємо його до ArrayList .
- Наприкінці ітерації новий ArrayList буде містити всі елементи, що повторюються, з вихідного списку ( List ).
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
Set<Integer> set = new HashSet<>();
List<Object> duplicates = new ArrayList<>();
numbers.forEach(n -> {
if (!set.add(n)) {
duplicates.add(n);
}
});
System.out.println("Duplicate elements: " + duplicates);
Висновок:
Duplicate elements: [3, 1, 2]
Зверніть увагу, що для перебору List ми використовували метод forEach() , але ви можете використовувати будь-який інший спосіб.
2. Використання Map
Нижче наведені етапи алгоритму цього способу пошуку дублікатів в List .- Створіть новий об'єкт Map і новий ArrayList для зберігання елементів, що повторюються.
- Ключами цього Map будуть елементами вихідного List , а його значення будуть кількістю їх входжень до List .
- Виконайте цикл за списком ( List ).
- Для кожного елемента в List перевірте, чи він існує як ключ у Map , використовуючи метод containsKey() .
- Якщо він існує, збільште його значення Map і додайте його знову, використовуючи метод put() .
- Якщо він не існує, додайте його до Map зі значенням 1.
- Після завершення ітерації списку, всі елементи Map зі значенням більше 1 стають дублікатами.
- Нарешті, виконайте ітерацію Map і додайте ті елементи, значення яких більше 1, до списку для зберігання елементів, що повторюються.
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
Map<Integer, Integer> countMap = new HashMap<>();
List<Object> duplicates = new ArrayList<>();
numbers.forEach(n -> {
if (countMap.containsKey(n)) {
countMap.put(n, countMap.get(n) + 1);
} else {
countMap.put(n, 1);
}
});
countMap.keySet().forEach(k -> {
if(countMap.get(k)> 1) {
duplicates.add(k);
}
});
3. Використання вкладених циклів (nested loops)
Якщо вас попросять знайти елементи, що повторюються, у списку без використання будь-яких класів Collection , таких як Set , Map і так далі, то цей спосіб буде корисний. Етапи алгоритму:- Виконайте цикл за списком ( List ).
- Після того, як цикл виконаний перший раз, поверніться до початку і знову повторіть всі дії для пошуку кожного елемента в частині списку.
- Якщо поточний елемент циклу дорівнює будь-якому з елементів, він є дублікатом.
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
List<Object> duplicates = new ArrayList<>();
for (int i = 0; i < numbers.size() - 1; i++) {
for (int j = i + 1; j < numbers.size(); j++) {
if (numbers.get(i).equals(numbers.get(j))) {
duplicates.add(numbers.get(i));
}
}
}
4. Використання Java Stream
Цей метод заснований на потоках Java 8 і працює так:- Перетворіть List на потік ( Stream ).
- Перетворіть потік на Map , використовуючи метод collect() . Наприклад, ключ ( key ) – це кожен елемент у списку, а значення ( value ) – це кількість входжень.
- Метод collect() повертається, і Map приймає Collector як аргумент. Реалізація Collector визначає ключі та значення результуючого Map .
- Оскільки ми хочемо, щоб ключі Map були елементами списку ( List ), а його значення були числом їх входжень, для створення колектора ми можемо використовувати Collectors.groupingBy() .
- Як тільки Map буде створено за допомогою groupingBy() , використовуйте метод entrySet() для отримання набору об'єктів Map.Entry .
- Відфільтруйте записи на основі значення (тобто кількості входжень) більше 1.
- Зіставте відфільтровані записи зі своїми ключами.
List<Integer> numbers = List.of(1, 2, 3, 4, 3, 1, 2);
Map<Object, Long> map = numbers.
stream().
collect(
Collectors.
groupingBy(n -> n, Collectors.counting())
);
List<Object> duplicates = map.
entrySet().
stream().
filter(e -> e.getValue() > 1).
map(e -> e.getKey()).
collect(Collectors.toList());
Метод groupingBy() використовується для групування елементів колекції на основі певних критеріїв. Ось приклад роботи цього методу:
- Критерій надається як лямбда-выражения, оскільки groupingBy() приймає аргумент Function , що є функціональним інтерфейсом.
- У разі ми групуємо за функцією ідентичності n -> n , що означає, що ми групуємо елементи списку з їхньої значенням.
- Другий аргумент groupingBy() — це ще один колектор, який вказує, як елементи кожної групи мають бути об'єднані.
- Тут ми використовуємо Collectors.counting() , який створює Map , що містить кількість кожного елемента у списку.
Як створити простий медіаплеєр за допомогою Java
Джерело: Medium Цей посібник допоможе вам створити на Java простий медіаплеєр для відтворення аудіо- та відеофайлів. Розробка медіаплеєра може стати чудовим способом навчитися використовувати вбудовані бібліотеки Java для роботи з медіафайлуми. Щоб виконати це завдання, ми будемо використовувати JavaFX і набір інструментів для графічного інтерфейсу (GUI) для Java.Крок 1: Налаштування проекту
Для початку нам потрібно налаштувати наш Java-проект. Як IDE ми будемо використовувати Eclipse, але ви можете працювати з будь-яким IDE на свій вибір. Створіть новий проект Java та назвіть його “MediaPlayer”. Нам також потрібно буде додати бібліотеку JavaFX до нашого проекту. Для цього перейдіть до властивостей проекту та додайте бібліотеку JavaFX у шлях складання проекту.Крок 2: Створення інтерфейсу користувача
Далі ми створимо інтерфейс для нашого медіаплеєра. Це буде простий інтерфейс користувача з кнопкою відтворення, кнопкою зупинки та панеллю медіаплеєра, де відображається відео- або аудіофайл, який ми хочемо відтворити. Для нашого інтерфейсу ми будемо використовувати макет BorderPane . Панель медіаплеєра буде в центрі BorderPane, а кнопки відтворення та зупинки — у нижній частині BorderPane. Ось код інтерфейсу користувача:import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaView;
import javafx.stage.Stage;
public class MediaPlayerApp extends Application {
private MediaPlayer mediaPlayer;
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Media Player");
Button playButton = new Button("Play");
playButton.setOnAction(e -> mediaPlayer.play());
Button stopButton = new Button("Stop");
stopButton.setOnAction(e -> mediaPlayer.stop());
BorderPane borderPane = new BorderPane();
Media media = new Media("http://www.example.com/sample.mp4");
mediaPlayer = new MediaPlayer(media);
MediaView mediaView = new MediaView(mediaPlayer);
borderPane.setCenter(mediaView);
borderPane.setBottom(stopButton);
borderPane.setRight(playButton);
Scene scene = new Scene(borderPane, 600, 400);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
У цьому коді ми створюємо дві кнопки: playButton та stopButton . При натисканні кнопки відтворення ми викликаємо метод play() об'єкта MediaPlayer . При натисканні кнопки зупинки ми викликаємо метод stop() об'єкта MediaPlayer . Ми також створюємо об'єкт Media з URL-адресаою прикладу відеофайлу та об'єкт MediaPlayer з об'єктом Media . Нарешті ми створюємо об'єкт MediaView з об'єктом MediaPlayer і встановлюємо його як центр BorderPane .
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ