JavaRush /Java блог /Random UA /Кава-брейк #209. 4 способи знайти дублікати у Java List. ...

Кава-брейк #209. 4 способи знайти дублікати у Java List. Як створити простий медіаплеєр за допомогою Java

Стаття з групи Random UA

4 способи знайти дублікати в Java List

Джерело: Codippa У цій статті розглянуто різні способи пошуку дублікатів у List. Дублікатами ми називаємо елементи, які зустрічаються більше одного разу. Кава-брейк #209.  4 способи знайти дублікати у Java List.  Як створити простий медіаплеєр за допомогою Java - 1

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 , що містить кількість кожного елемента у списку.
У результаті результат Map буде містити підрахунок того, скільки разів кожен елемент з'являється в списку. Потім ми фільтруємо Map за допомогою методу filter() , щоб знайти елементи, кількість яких більша за 1, що вказує на те, що вони є дублікатами.

Як створити простий медіаплеєр за допомогою Java

Джерело: Medium Цей посібник допоможе вам створити на Java простий медіаплеєр для відтворення аудіо- та відеофайлів. Кава-брейк #209.  4 способи знайти дублікати у Java List.  Як створити простий медіаплеєр за допомогою Java - 2Розробка медіаплеєра може стати чудовим способом навчитися використовувати вбудовані бібліотеки 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 .

Крок 3. Тестування медіаплеєра

Тепер, коли у нас налаштований інтерфейс медіаплеєра, ми можемо протестувати його, запустивши додаток. Коли ми запускаємо програму, має з'явитися інтерфейс користувача медіаплеєра, і ми можемо натиснути кнопку відтворення, щоб почати відтворення відеофайлу. Також ми можемо натиснути кнопку зупинки, щоб зупинити відтворення відеофайлу.

Крок 4: Налаштування медіаплеєра

Тепер, коли у нас є медіаплеєр, що працює, ми можемо налаштувати його на свій смак. Ми можемо змінити макет інтерфейсу користувача, змінити відтворюваний відеофайл, додати додаткові кнопки для регулювання гучності або додати індикатор виконання, що показує хід відтворення відео.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ