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

Кофе-брейк #209. 4 способа найти дубликаты в Java List. Как создать простой медиаплеер с помощью Java

Статья из группы Random

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: Настройка медиаплеера

Теперь, когда у нас есть работающий медиаплеер, мы можем настроить его по своему вкусу. Мы можем изменить макет пользовательского интерфейса, изменить воспроизводимый видеофайл, добавить дополнительные кнопки для регулировки громкости или добавить индикатор выполнения, показывающий ход воспроизведения видео.
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ