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.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ