Trong hướng dẫn này, chúng ta sẽ xem cách loại bỏ các bản sao khỏi ArrayList trong Java bằng nhiều API inbuild và thư viện của bên thứ ba
Danh sách Java là một giao diện tạo điều kiện lưu trữ một bộ sưu tập dữ liệu được sắp xếp theo thứ tự. Nó cho phép lưu trữ các giá trị trùng lặp. Nhiều khi chúng ta cần tránh trùng lặp trong List. Chúng tôi cần tuân theo một phương pháp nhất định để đạt được các giá trị danh sách duy nhất vì nó không khả dụng
nội dung
Với API Java đơn giản [Xóa các bản sao khỏi ArrayList trong Java]
Đây có lẽ là cách đơn giản nhất để loại bỏ các bản sao khỏi danh sách như sau
List nameLst = Arrays.asList["Nilang","Sam","Peter","Denial","Peter"]; System.out.println["Original List :: "+nameLst]; List uniqueNameLst = new ArrayList[]; for[String name : nameLst]{ if[!uniqueNameLst.contains[name]]{ uniqueNameLst.add[name]; } } System.out.println["Updated List :: "+uniqueNameLst];
Cách dễ nhất để loại bỏ các giá trị trùng lặp là tạo danh sách thứ hai và chỉ thêm các giá trị duy nhất. Điều này có thể ảnh hưởng đến hiệu suất nếu kích thước danh sách lớn. Đầu ra như sau
Original List :: [Nilang, Sam, Peter, Denial, Peter] Updated List :: [Nilang, Sam, Peter, Denial]
Các phần tử trong danh sách được cập nhật vẫn giữ nguyên thứ tự
Với Set in Core Java API [Xóa các bản sao khỏi danh sách trong Java]
Một Set trong Java có thể được sử dụng để loại bỏ các bản sao khỏi danh sách như sau
List nameLst = new ArrayList[]; nameLst.add["Nilang"]; nameLst.add["Sam"]; nameLst.add["Peter"]; nameLst.add["Denial"]; nameLst.add["Peter"]; System.out.println["Original List :: "+nameLst]; Set uniqueNameSet = new HashSet[nameLst]; List uniqueNameLst = new ArrayList[uniqueNameSet]; System.out.println["Updated List :: "+uniqueNameLst];
Giải trình
Chúng tôi đang nhờ sự trợ giúp của Đặt để xóa trùng lặp. Đặt trong Java không cho phép trùng lặp. Vì vậy, lưu trữ nội dung danh sách vào Set trước rồi tạo một danh sách mới từ nó. Bạn có thể rút gọn đoạn mã trên như sau
List nameLst = Arrays.asList["Nilang","Sam","Peter","Denial","Peter"]; System.out.println["Original List :: "+nameLst]; Set uniqueNameSet = new HashSet[nameLst]; List uniqueNameLst = new ArrayList[uniqueNameSet]; System.out.println["Updated List :: "+uniqueNameLst];
Đầu ra sẽ như sau
Original List :: [Nilang, Sam, Peter, Denial, Peter] Updated List :: [Peter, Denial, Nilang, Sam]
Sau khi sử dụng Set, thứ tự dữ liệu trong danh sách bị thay đổi. Trong trường hợp nếu thứ tự các phần tử quan trọng, bạn có thể sử dụng LinkedHashSet như sau
List nameLst = Arrays.asList["Nilang","Sam","Peter","Denial","Peter"]; System.out.println["Original List :: "+nameLst]; Set uniqueNameSet = new LinkedHashSet[nameLst]; List uniqueNameLst = new ArrayList[uniqueNameSet]; System.out.println["Updated List :: "+uniqueNameLst];
LinkedHashSet không chỉ loại bỏ các phần tử trùng lặp mà còn duy trì thứ tự. Đầu ra như sau
Original List :: [Nilang, Sam, Peter, Denial, Peter] Updated List :: [Nilang, Sam, Peter, Denial]
Với Set in Google Guava API [Xóa các bản sao khỏi ArrayList trong Java]
Google cung cấp API Guava, cung cấp các lớp tiện ích. Chúng được sử dụng để chơi với khung bộ sưu tập với ít dòng mã hơn như sau
List nameLst = Lists.newArrayList["Nilang","Sam","Peter","Denial","Peter"]; System.out.println["Original List :: "+nameLst]; List uniqueNameLst = new ArrayList[Sets.newLinkedHashSet[nameLst]]; System.out.println["Updated List :: "+uniqueNameLst];
Giải trình
Trong Guava, Lists là một lớp tiện ích được sử dụng để tạo ArrayList. Tương tự, lớp Sets được sử dụng để tạo một LinkedHashSet mới. Trong ví dụ này cũng vậy, chúng tôi đang sử dụng cùng một phương pháp – trước tiên hãy thêm dữ liệu vào Set để loại bỏ trùng lặp và sau đó tạo Danh sách mới từ đó
Bạn sẽ nhận được kết quả giống như trong trường hợp trước vì LinkedHashSet giữ nguyên thứ tự của các phần tử
Nếu bạn đang sử dụng Maven, bạn có thể thêm phụ thuộc Guava như sau vào pom của mình. xml
Sử dụng Luồng Java 8. API riêng biệt [] [Xóa các bản sao khỏi danh sách trong Java]
Hãy nói về một giải pháp mới. Kể từ phiên bản 8, Java cung cấp API luồng, bạn có thể sử dụng API này để trích xuất dữ liệu ở các định dạng khác nhau. Chúng tôi sẽ sử dụng phương thức riêng biệt [] để loại bỏ các giá trị trùng lặp. Mã được cập nhật trông như sau
List nameLst = Arrays.asList["Nilang","Sam","Peter","Denial","Peter"]; System.out.println["Original List :: "+nameLst]; List uniqueNameLst = nameLst.stream[] .distinct[] .collect[Collectors.toList[]]; System.out.println["Updated List :: "+uniqueNameLst];
Giải trình
- Phương thức stream[] trên List cung cấp Stream of String
- Phương thức riêng biệt [] sẽ chỉ trả về các giá trị duy nhất
- Phương thức coll[] sử dụng Stream of String và điền vào Danh sách bằng cách cung cấp Collectors. tham số toList[]
- Sau đó, một loạt các cuộc gọi phương thức [cho đến khi phương thức Collect[]] sẽ trả về một Danh sách với các giá trị duy nhất
Đầu ra sẽ như sau
Original List :: [Nilang, Sam, Peter, Denial, Peter] Updated List :: [Nilang, Sam, Peter, Denial]
Bạn sẽ thấy, Stream API giữ nguyên thứ tự ban đầu của danh sách trong khi loại bỏ trùng lặp
Đặt Vs Stream API, chọn cái gì và khi nào?
Câu hỏi quan trọng nhất. Lựa chọn nào phù hợp nhất với bạn? . 8 trở lên, hãy sử dụng Stream API. Nếu không thì chọn LinkedHashSet
Tuy nhiên, không có quy tắc mã cứng. Bạn vẫn có thể sử dụng LinkedHashSet cho Java 1. 8 trở lên, tuy nhiên, Stream API được khuyên dùng nhiều hơn để có mã rõ ràng hơn và linh hoạt hơn