4 sposoby na znalezienie duplikatów na liście Java
Źródło: Codippa W tym artykule opisano różne sposoby znajdowania duplikatów na liście. Duplikatami nazywamy elementy, które pojawiają się więcej niż raz.1. Korzystanie z zestawu
Poniżej znajduje się algorytm znajdowania zduplikowanych elementów na liście Java za pomocą Set .- Tworzymy nowy obiekt Java Set i nową ArrayList do przechowywania zduplikowanych elementów.
- Wykonujemy iterację lub pętlę po liście.
- Każdy element listy dodajemy do Seta za pomocą metody add() .
- W rezultacie add() zwraca wartość true , jeśli element został dodany, i false , jeśli element był już obecny w zestawie .
- Jeśli element znajduje się już w zestawie , jest to duplikat. Następnie dodajemy go do ArrayList .
- Na koniec iteracji nowa ArrayList będzie zawierać wszystkie zduplikowane elementy z oryginalnej Listy ( 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);
Wniosek:
Powielone elementy: [3, 1, 2]
Zauważ, że do iteracji po liście użyliśmy metody forEach() , ale możesz użyć dowolnej innej metody.
2. Korzystanie z mapy
Poniżej znajdują się kroki algorytmu dla tej metody wyszukiwania duplikatów na liście .- Utwórz nowy obiekt Map i nową ArrayList do przechowywania zduplikowanych elementów.
- Kluczami tej Mapy będą elementy oryginalnej Listy , a jej wartościami będzie liczba ich wystąpień na Liście .
- Przejdź listę w pętli ( List ).
- Dla każdego elementu na Liście sprawdź, czy istnieje jako klucz na Mapie , używając metody zawieraKey() .
- Jeśli istnieje, zwiększ jego wartość na mapie i dodaj ją ponownie, używając metody put() .
- Jeśli nie istnieje, dodaj go do Mapy z wartością 1.
- Po zakończeniu iteracji listy wszystkie elementy mapy o wartości większej niż 1 stają się duplikatami.
- Na koniec wykonaj iterację mapy i dodaj te elementy, których wartość jest większa niż 1, do listy, aby przechowywać zduplikowane elementy.
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. Korzystanie z zagnieżdżonych pętli
Jeśli zostaniesz poproszony o znalezienie zduplikowanych elementów na liście bez użycia klas Collection , takich jak Set , Map itd., ta metoda będzie przydatna. Etapy algorytmu:- Przejdź listę w pętli ( List ).
- Po pierwszym ukończeniu pętli wróć do początku i powtórz kroki jeszcze raz, aby znaleźć każdy element na pozostałej części listy.
- Jeśli bieżący element pętli jest równy któremukolwiek z pozostałych elementów, jest to duplikat.
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. Korzystanie ze strumienia Java
Ta metoda opiera się na wątkach Java 8 i działa w następujący sposób:- Konwertuj listę na strumień .
- Przekonwertuj strumień na mapę za pomocą metody Collect() . Na przykład klucz to każdy element na liście, a wartość to liczba wystąpień.
- Metoda Collect() zwraca wartość, a Map przyjmuje Collector jako argument. Implementacja Collectora określa klucze i wartości wynikowej Mapy .
- Ponieważ chcemy, aby klucze Mapy były elementami Listy , a jej wartością była liczba ich wystąpień, możemy użyć Collectors.groupingBy() do utworzenia kolektora .
- Po utworzeniu mapy za pomocą groupingBy() użyj metody EntrySet() w celu uzyskania zestawu obiektów Map.Entry .
- Filtruj rekordy na podstawie wartości (czyli liczby wystąpień) większej niż 1.
- Dopasuj przefiltrowane rekordy do ich kluczy.
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());
Metoda groupingBy() służy do grupowania elementów w kolekcji na podstawie określonych kryteriów. Oto przykład działania tej metody:
- Kryterium jest podawane w postaci wyrażenia lambda, ponieważ groupingBy() przyjmuje argument Function , który jest interfejsem funkcji.
- W tym przypadku grupujemy według funkcji tożsamości n -> n , co oznacza, że grupujemy elementy listy według ich wartości.
- Drugi argument groupingBy() to kolejny moduł zbierający, który określa, w jaki sposób powinny być łączone elementy w każdej grupie.
- Tutaj używamy Collectors.counting() , która tworzy mapę zawierającą liczbę każdego elementu na liście.
Jak utworzyć prosty odtwarzacz multimediów przy użyciu języka Java
Źródło: Medium Ten samouczek pomoże Ci stworzyć prosty odtwarzacz multimedialny w Javie do odtwarzania plików audio i wideo. Tworzenie odtwarzacza multimedialnego może być świetnym sposobem na naukę korzystania z wbudowanych bibliotek Java do pracy z plikami multimedialnymi. Aby wykonać to zadanie, użyjemy JavaFX i zestawu narzędzi graficznego interfejsu użytkownika (GUI) dla języka Java.Krok 1: Konfiguracja projektu
Najpierw musimy skonfigurować nasz projekt Java. Będziemy używać Eclipse jako IDE, ale możesz użyć dowolnego wybranego IDE. Utwórz nowy projekt Java i nadaj mu nazwę „MediaPlayer”. Będziemy musieli także dodać do naszego projektu bibliotekę JavaFX. Aby to zrobić, przejdź do właściwości projektu i dodaj bibliotekę JavaFX do ścieżki kompilacji projektu.Krok 2: Utwórz interfejs użytkownika
Następnie stworzymy interfejs użytkownika dla naszego odtwarzacza multimedialnego. Będzie to prosty interfejs użytkownika z przyciskiem odtwarzania, przyciskiem zatrzymania i panelem odtwarzacza multimedialnego, który wyświetla plik wideo lub audio, który chcemy odtworzyć. W naszym interfejsie użyjemy układu BorderPane . Panel odtwarzacza multimedialnego będzie znajdować się pośrodku BorderPane, a przyciski odtwarzania i zatrzymywania będą znajdować się na dole BorderPane. Oto kod interfejsu użytkownika: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);
}
}
W tym kodzie tworzymy dwa przyciski: playButton i stopButton . Po kliknięciu przycisku odtwarzania wywołujemy metodę play() obiektu mediaPlayer . Po kliknięciu przycisku stop wywołujemy metodę stop() obiektu mediaPlayer . Tworzymy także obiekt Media z adresem URL przykładowego pliku wideo oraz obiekt mediaPlayer z obiektem Media . Na koniec tworzymy obiekt MediaView z obiektem MediaPlayer i ustawiamy go jako środek BorderPane .
GO TO FULL VERSION