- Удаление повторяющихся элементов из ArrayList в Java
- Использование HashSet
- Использование Stream API
- Кофе-брейк #209. 4 способа найти дубликаты в Java List. Как создать простой медиаплеер с помощью Java
- 1. Использование Set
- 2. Использование Map
- 3. Использование вложенных циклов (nested loops)
- 4. Использование Java Stream
- Как создать простой медиаплеер с помощью Java
- Шаг 1: Настройка проекта
- Шаг 2: Создание пользовательского интерфейса
- Шаг 3. Тестирование медиаплеера
- Шаг 4: Настройка медиаплеера
- Как найти дубликаты в List
- Решение
- Проверка программы
- Исходный код
- Заключение
- Remove Duplicate Items from a List in Java
Удаление повторяющихся элементов из ArrayList в Java
Часто в процессе работы с коллекциями в Java возникает необходимость удалить повторяющиеся элементы. Рассмотрим пример: есть ArrayList , который содержит несколько одинаковых строк. Задача состоит в том, чтобы оставить только уникальные строки, то есть удалить повторения.
ArrayList<String> list = new ArrayList<String>(); list.add("Java"); list.add("Python"); list.add("Java"); list.add("Ruby"); list.add("Python");
В данном примере, строки «Java» и «Python» повторяются два раза. В итоге, нужно получить ArrayList без повторений: «Java», «Python», «Ruby».
Существует несколько способов решения данной задачи.
Использование HashSet
Один из простейших способов — использование HashSet . HashSet в Java представляет собой коллекцию, которая не содержит повторяющихся элементов. При добавлении элемента в HashSet , который уже там присутствует, он просто не будет добавлен.
Set<String> set = new HashSet<>(list);
Далее, можно преобразовать HashSet обратно в ArrayList следующим образом:
В результате, ArrayList list будет содержать только уникальные строки.
Использование Stream API
В Java 8 было введено Stream API, которое также позволяет решить данную задачу. С помощью метода distinct() , который возвращает стрим без дубликатов, можно удалить повторяющиеся элементы:
List<String> unique = list.stream().distinct().collect(Collectors.toList());
В данном случае, создается новый ArrayList unique , который содержит только уникальные строки из list .
Оба представленных способа эффективны для удаления повторяющихся элементов из ArrayList в Java. Выбор конкретного метода зависит от конкретных условий и требований к коду.
Кофе-брейк #209. 4 способа найти дубликаты в Java List. Как создать простой медиаплеер с помощью Java
Источник: Codippa В этой статье рассмотрены различные способы поиска дубликатов в List. Дубликатами мы называет элементы, которые встречаются более одного раза.
1. Использование Set
- Создаем новый объект Java Set и новый ArrayList для хранения повторяющихся элементов.
- Выполняем итерацию или цикл по списку.
- Каждый элемент в списке добавляем в Set , используя метод add() .
- В результате add() возвращает true, если элемент добавлен, и false, если элемент уже присутствовал в Set .
- Если элемент уже есть в Set , он является дубликатом. Тогда мы добавляем его в ArrayList .
- В конце итерации новый ArrayList будет содержать все повторяющиеся элементы из исходного списка ( List ).
List numbers = List.of(1, 2, 3, 4, 3, 1, 2); Set set = new HashSet<>(); List duplicates = new ArrayList<>(); numbers.forEach(n -> < if (!set.add(n)) < duplicates.add(n); >>); System.out.println("Duplicate elements: " + duplicates);
Обратите внимание, что для перебора List мы использовали метод forEach() , но вы можете использовать и любой другой способ.
2. Использование Map
- Создайте новый объект Map и новый ArrayList для хранения повторяющихся элементов.
- Ключами этого Map будут элементами исходного List , а его значения будут количеством их вхождений в List .
- Выполните цикл по списку ( List ).
- Для каждого элемента в List проверьте, существует ли он как ключ в Map , используя метод containsKey() .
- Если он существует, увеличьте его значение в Map и добавьте его снова, используя метод put() .
- Если он не существует, добавьте его в Map со значением 1.
- После завершения итерации списка все элементы Map со значением больше 1 становятся дубликатами.
- Наконец, выполните итерацию Map и добавьте те элементы, значение которых больше 1, в список для хранения повторяющихся элементов.
List numbers = List.of(1, 2, 3, 4, 3, 1, 2); Map countMap = new HashMap<>(); List 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)
- Выполните цикл по списку ( List ).
- После того, как цикл выполнен первый раз, вернитесь к началу и снова повторите все действия для поиска каждого элемента в оставшейся части списка.
- Если текущий элемент цикла равен любому из оставшихся элементов, он является дубликатом.
List numbers = List.of(1, 2, 3, 4, 3, 1, 2); List 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
- Преобразуйте List в поток ( Stream ).
- Преобразуйте поток в Map , используя метод collect() . Например, ключ ( key ) — это каждый элемент в списке, а значение ( value ) — это количество вхождений.
- Метод collect() возвращается, и Map принимает Collector в качестве аргумента. Реализация Collector определяет ключи и значения результирующего Map .
- Поскольку мы хотим, чтобы ключи Map были элементами списка ( List ), а его значения были числом их вхождений, для создания коллектора мы можем использовать Collectors.groupingBy() .
- Как только Map будет создан с помощью groupingBy() , используйте метод entrySet() для получения набора объектов Map.Entry .
- Отфильтруйте записи на основе значения (то есть количества вхождений) больше 1.
- Сопоставьте отфильтрованные записи с их ключами.
List numbers = List.of(1, 2, 3, 4, 3, 1, 2); Map map = numbers. stream(). collect( Collectors. groupingBy(n -> n, Collectors.counting()) ); List duplicates = map. entrySet(). stream(). filter(e -> e.getValue() > 1). map(e -> e.getKey()). collect(Collectors.toList());
- Критерий предоставляется в виде лямбда-выражения, поскольку 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 .
Шаг 3. Тестирование медиаплеера
Теперь, когда у нас настроен пользовательский интерфейс медиаплеера, мы можем протестировать его, запустив приложение. Когда мы запускаем приложение, должен появиться пользовательский интерфейс медиаплеера, и мы можем нажать кнопку воспроизведения, чтобы начать воспроизведение видеофайла. Также мы можем нажать кнопку остановки, чтобы остановить воспроизведение видеофайла.
Шаг 4: Настройка медиаплеера
Теперь, когда у нас есть работающий медиаплеер, мы можем настроить его по своему вкусу. Мы можем изменить макет пользовательского интерфейса, изменить воспроизводимый видеофайл, добавить дополнительные кнопки для регулировки громкости или добавить индикатор выполнения, показывающий ход воспроизведения видео.
Как найти дубликаты в List
Иногда требуется найти дубликаты в существующем списке. Например, это может быть список строк или чисел. Это довольно легко сделать методом перебора.
Решение
Сперва объявим коллекцию для хранения дублирующихся значений. В качестве такой коллекции лучше взять HashSet. Эта коллекция сама по себе не будет содержать дубликатов.
Set duplicates = new HashSet<>();
Затем мы будем в одном цикле проходить по всем элементам массива, брать каждый элемент и сравнивать его со всеми остальными элементами (но уже во втором цикле):
После этого возвратим список дубликатов:
return new ArrayList<>(duplicates);
Проверка программы
List animals = Arrays.asList("cat", "dog", "cow", "sheep", "cat", "dog"); System.out.println("Входной массив: " + animals); System.out.println("Дубликаты: " + getDuplicatesWithIteration(animals));
Исходный код
package ru.javalessons.arrays; import java.util.*; public class ListFindDuplicates < public static void main(String[] args) < Listanimals = Arrays.asList("cat", "dog", "cow", "sheep", "cat", "dog"); System.out.println("Входной массив: " + animals); System.out.println("Дубликаты: " + getDuplicatesWithIteration(animals)); > public static List getDuplicatesWithIteration(List a) < Setduplicates = new HashSet<>(); for (int i = 0; i < a.size(); i++) < E e1 = a.get(i); if (e1 == null) continue; // игнорируем null // сравниваем каждый элемент со всеми остальными for (int j = 0; j < a.size(); j++) < if (i == j) continue; // не проверяем элемент с собой же E e2 = a.get(j); if (e1.equals(e2)) < // дубликат найден, сохраним его duplicates.add(e2); >> > return new ArrayList<>(duplicates); > >
Заключение
Довольно простым методом перебора можно найти дубликаты в списке.
Remove Duplicate Items from a List in Java
Learn to remove duplicate elements from a List in Java using Collection.removeIf(), LinkedHashSet and Stream APIs.
1. Using Collection.removeIf()
The removeIf() method removes all of the elements of this collection that satisfy a specified Predicate. Each matching element is removed using Iterator.remove(). If the collection’s iterator does not support removal, then an UnsupportedOperationException will be thrown on the first matching element.
In the following code, the predicate adds the current element to a HashSet. As HashSet does not allow duplicate items, the add() method returns false for them. All such duplicate items are removed from the List, and finally, the List contains only the unique items.
List items = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8)); Set set = new HashSet<>(items.size()); items.removeIf(p -> !set.add(p)); System.out.println(items); //[1, 2, 3, 4, 5, 6, 7, 8]
We can use the Java 8 Stream. distinct() method which returns a stream consisting of the distinct elements compared by object’s equals() method. Finally, collect all district elements as List using Collectors.toList().
ArrayList numbersList = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8)); List listWithoutDuplicates = numbersList.stream().distinct().collect(Collectors.toList()); System.out.println(listWithoutDuplicates); //[1, 2, 3, 4, 5, 6, 7, 8]
The LinkedHashSet is another good approach for removing duplicate elements in an ArrayList. LinkedHashSet does two things internally :
In the given example, items in the ArrayList contain integers; some are duplicate numbers e.g. 1, 3 and 5. We add the list to LinkedHashSet, and then get back the content back into the list. The result arraylist does not have duplicate integers.
ArrayList numbersList = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8)); LinkedHashSet hashSet = new LinkedHashSet<>(items); ArrayList listWithoutDuplicates = new ArrayList<>(hashSet); System.out.println(listWithoutDuplicates); //[1, 2, 3, 4, 5, 6, 7, 8]
Drop me your questions related to how to remove duplicate objects in arraylist in Java.