4 cách để tìm bản sao trong danh sách Java
Nguồn: Codippa Bài viết này trình bày nhiều cách khác nhau để tìm các bản sao trong Danh sách. Chúng tôi gọi các phần tử trùng lặp xuất hiện nhiều lần.1. Sử dụng Bộ
Dưới đây là thuật toán tìm các phần tử trùng lặp trong Danh sách Java bằng cách sử dụng Set .- Chúng tôi tạo một đối tượng Java Set mới và một ArrayList mới để lưu trữ các phần tử trùng lặp.
- Chúng tôi thực hiện một phép lặp hoặc lặp qua danh sách.
- Chúng ta thêm từng phần tử trong danh sách vào Set bằng phương thức add() .
- Kết quả là add() trả về true nếu phần tử đã được thêm và false nếu phần tử đã có trong Set .
- Nếu phần tử đã có trong Set thì đó là một phần tử trùng lặp. Sau đó, chúng tôi thêm nó vào ArrayList .
- Khi kết thúc quá trình lặp, ArrayList mới sẽ chứa tất cả các phần tử trùng lặp từ Danh sách ban đầu ( 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);
Phần kết luận:
Các phần tử trùng lặp: [3, 1, 2]
Lưu ý rằng chúng tôi đã sử dụng phương thức forEach() để lặp qua List nhưng bạn có thể sử dụng bất kỳ phương thức nào khác.
2. Sử dụng Bản đồ
Dưới đây là các bước thuật toán cho phương pháp tìm bản sao trong Danh sách này .- Tạo một đối tượng Map mới và một ArrayList mới để chứa các phần tử trùng lặp.
- Các khóa của Bản đồ này sẽ là các thành phần của Danh sách ban đầu và các giá trị của nó sẽ là số lần xuất hiện của chúng trong Danh sách .
- Lặp qua danh sách ( List ).
- Đối với mỗi phần tử trong Danh sách , hãy kiểm tra xem nó có tồn tại dưới dạng khóa trong Bản đồ hay không bằng phương thức containsKey() .
- Nếu nó tồn tại, hãy tăng giá trị của nó trong Bản đồ và thêm lại bằng phương thức put() .
- Nếu nó không tồn tại, hãy thêm nó vào Bản đồ với giá trị là 1.
- Sau khi quá trình lặp lại danh sách hoàn tất, tất cả các thành phần Bản đồ có giá trị lớn hơn 1 sẽ trở thành bản sao.
- Cuối cùng, lặp lại Bản đồ và thêm các phần tử có giá trị lớn hơn 1 vào danh sách để lưu trữ các phần tử trùng lặp.
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. Sử dụng các vòng lặp lồng nhau
Nếu bạn được yêu cầu tìm các phần tử trùng lặp trong danh sách mà không sử dụng bất kỳ lớp Bộ sưu tập nào như Set , Map , v.v. thì phương pháp này sẽ hữu ích. Các giai đoạn thuật toán:- Lặp qua danh sách ( List ).
- Sau khi hoàn thành vòng lặp lần đầu tiên, hãy quay lại từ đầu và lặp lại các bước một lần nữa để tìm từng mục trong phần còn lại của danh sách.
- Nếu phần tử vòng lặp hiện tại bằng với bất kỳ phần tử nào còn lại thì đó là một bản sao.
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. Sử dụng luồng Java
Phương thức này dựa trên các luồng Java 8 và hoạt động như thế này:- Chuyển đổi danh sách thành luồng .
- Chuyển đổi luồng thành Bản đồ bằng phương thức coll() . Ví dụ: khóa là từng phần tử trong danh sách và giá trị là số lần xuất hiện.
- Phương thức Collect() trả về và Map lấy Collector làm đối số. Việc triển khai Collector xác định các khóa và giá trị của Map kết quả .
- Vì chúng ta muốn các khóa của Bản đồ là các thành phần của Danh sách và các giá trị của nó là số lần xuất hiện của chúng, nên chúng ta có thể sử dụng Collectors.groupingBy() để tạo một bộ sưu tập .
- Khi Bản đồ đã được tạo bằng cách sử dụng groupingBy() , hãy sử dụng phương thức entrySet() để lấy một tập hợp các đối tượng Map.Entry .
- Lọc các bản ghi dựa trên giá trị (nghĩa là số lần xuất hiện) lớn hơn 1.
- Ghép các bản ghi đã lọc với khóa của chúng.
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());
Phương thức groupingBy() được sử dụng để nhóm các mục trong bộ sưu tập dựa trên các tiêu chí nhất định. Đây là một ví dụ về cách hoạt động của phương pháp này:
- Tiêu chí này được cung cấp dưới dạng biểu thức lambda vì groupingBy() lấy đối số Hàm , là một giao diện hàm.
- Trong trường hợp này, chúng tôi nhóm theo hàm nhận dạng n -> n , có nghĩa là chúng tôi nhóm các thành phần danh sách theo giá trị của chúng.
- Đối số thứ hai của groupingBy() là một bộ sưu tập khác chỉ định cách kết hợp các phần tử trong mỗi nhóm.
- Ở đây chúng tôi sử dụng Collectors.counting() để tạo Bản đồ chứa số lượng từng phần tử trong danh sách.
Cách tạo một trình phát đa phương tiện đơn giản bằng Java
Nguồn: Medium Hướng dẫn này sẽ giúp bạn tạo một trình phát đa phương tiện đơn giản trong Java để phát các tệp âm thanh và video. Phát triển trình phát đa phương tiện có thể là một cách tuyệt vời để tìm hiểu cách sử dụng các thư viện tích hợp sẵn của Java để làm việc với các tệp phương tiện. Để hoàn thành nhiệm vụ này, chúng tôi sẽ sử dụng JavaFX và bộ công cụ Giao diện người dùng đồ họa (GUI) cho Java.Bước 1: Thiết lập dự án
Đầu tiên, chúng ta cần thiết lập dự án Java của mình. Chúng ta sẽ sử dụng Eclipse làm IDE, nhưng bạn có thể sử dụng bất kỳ IDE nào mà bạn chọn. Tạo một dự án Java mới và đặt tên là “MediaPlayer”. Chúng tôi cũng sẽ cần thêm thư viện JavaFX vào dự án của mình. Để thực hiện việc này, hãy chuyển đến thuộc tính dự án và thêm thư viện JavaFX vào đường dẫn xây dựng của dự án.Bước 2: Tạo giao diện người dùng
Tiếp theo chúng ta sẽ tạo giao diện người dùng cho trình phát media của mình. Nó sẽ là một giao diện người dùng đơn giản với nút phát, nút dừng và bảng trình phát đa phương tiện hiển thị tệp video hoặc âm thanh mà chúng ta muốn phát. Đối với giao diện của chúng tôi, chúng tôi sẽ sử dụng bố cục BorderPane . Bảng điều khiển trình phát đa phương tiện sẽ nằm ở giữa BorderPane và các nút phát và dừng sẽ ở cuối BorderPane. Đây là mã giao diện người dùng: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);
}
}
Trong mã này, chúng tôi tạo hai nút: playButton và stopButton . Khi nút phát được nhấp vào, chúng ta gọi phương thức play() của đối tượng mediaPlayer . Khi nhấn vào nút dừng, chúng ta gọi phương thức stop() của đối tượng mediaPlayer . Chúng tôi cũng tạo một đối tượng Media với URL của tệp video mẫu và một đối tượng mediaPlayer với đối tượng Media . Cuối cùng, chúng ta tạo một đối tượng MediaView với đối tượng MediaPlayer và đặt nó làm trung tâm của BorderPane .
GO TO FULL VERSION