CodeGym /Blog Java /Ngẫu nhiên /Lớp bộ sưu tập trong Java

Lớp bộ sưu tập trong Java

Xuất bản trong nhóm
CHÀO! Trong vài bài học vừa qua, chúng ta đã đạt được tiến bộ lớn trong việc thành thạo ArrayList. Tuy nhiên, cho đến nay chúng ta mới chỉ thực hiện các thao tác đơn giản nhất: xóa, chèn và hiển thị. Tất nhiên, điều này không bao gồm danh sách đầy đủ các tác vụ mà nhà phát triển phải thực hiện khi làm việc với ArrayList. Bạn còn nhớ bài học về mảng và Arrayslớp không? Những người tạo ra Java đã thiết kế lớp này một cách đặc biệt để xử lý các tác vụ phổ biến nhất mà các lập trình viên gặp phải khi làm việc với mảng. Và thế cònArrayList? Chắc chắn, có một số danh sách các tác vụ phổ biến cần được thực hiện với nó. Tất cả chúng đã được triển khai trong một lớp cụ thể hay chúng ta phải viết triển khai của riêng mình mỗi lần? Tất nhiên, bạn không cần phải tự viết mọi thứ. Các hoạt động phổ biến nhất liên quan đến các bộ sưu tập đã được triển khai trong Collectionslớp tĩnh đặc biệt. Bộ sưu tập lớp - 1 Trong Java, một nhóm các cấu trúc dữ liệu thường được gọi là một bộ sưu tập . Dữ liệu có thể được lưu trữ theo nhiều cách khác nhau. Cho đến nay, chúng ta mới chỉ nghiên cứu về ArrayListlớp, nơi dữ liệu được lưu trữ trong một mảng. Chúng ta sẽ làm quen với các bộ sưu tập khác sau. Hiện tại, chỉ cần hiểu rằng Collectionslớp được thiết kế để hoạt động không chỉ vớiArrayList, mà còn với các loại bộ sưu tập khác (do đó, tên của nó). Vì vậy, lớp thực sự trợ giúp với những nhiệm vụ nào Collectionskhi làm việc với ArrayList? Đầu tiên và rõ ràng nhất là sắp xếp. Trong bài học về mảng, chúng ta đã xem xét một ví dụ với các số. Bây giờ chúng ta sẽ xem xét một ví dụ với chuỗi. Lớp Collectionsthực hiện sort()phương thức sắp xếp nội dung của các bộ sưu tập:

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       System.out.println(solarSystem);

   }
}
Đầu ra: [Trái đất, Sao Mộc, Sao Hỏa, Sao Thủy, Sao Hải Vương, Sao Thổ, Sao Thiên Vương, Sao Kim] Các chuỗi được sắp xếp theo thứ tự bảng chữ cái! Nhưng tại sao lại theo bảng chữ cái? Lớp Stringthực sự triển khai logic chi phối cách so sánh các chuỗi (xảy ra theo thứ tự bảng chữ cái). Đối với các lớp do bạn tự tạo, bạn có thể triển khai logic so sánh của riêng mình, nhưng chúng ta sẽ nói về điều này trong các bài học khác. Lớp này Collectionscũng giúp bạn tìm phần tử tối thiểu và tối đa trong tệp ArrayList. Điều này được thực hiện bằng cách sử dụng phương thức min()max():

public static void main(java.lang.String[] args) {

   ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
   System.out.println(Collections.max(numbers));
   System.out.println(Collections.min(numbers));

}
Kết quả: 7 1 Đương nhiên, điều này thuận tiện hơn nhiều so với viết mã thủ công để lặp qua tất cả các phần tử và tìm phần tử lớn nhất/nhỏ nhất :) Một phương pháp rất hữu ích khác là reverse(). Nếu chúng ta phải "lật" danh sách để các phần tử đi theo thứ tự ngược lại, chúng ta sẽ làm như thế nào? Có lẽ sẽ không dễ dàng để tự viết một thuật toán như vậy :) May mắn thay, phương reverse()pháp này đã biết cách thực hiện. Giả sử chúng ta không thích thực tế là sort()phương pháp đã sắp xếp các hành tinh của chúng ta theo thứ tự bảng chữ cái và chúng ta muốn đảo ngược thứ tự của chúng: từ Z đến A:

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune));
       Collections.sort(solarSystem);
       Collections.reverse(solarSystem);
       System.out.println(solarSystem);

   }
}
Đầu ra: [Sao Kim, Sao Thiên Vương, Sao Thổ, Sao Hải Vương, Sao Thủy, Sao Hỏa, Sao Mộc, Trái Đất] Chúng ta đã nói rất nhiều về việc phân loại, thứ tự của các nguyên tố, v.v. Nhưng nếu chúng ta có mục tiêu ngược lại thì sao? Ví dụ: giả sử chúng tôi đang cố triển khai trò chơi bingo. Chúng tôi thêm 100 số vào trống. Chúng sẽ xuất hiện trên màn hình cùng một lúc. Người chơi đầu tiên gạch bỏ tất cả các số trên vé của mình sẽ thắng. Điều này rất dễ thực hiện bằng shuffle()phương pháp:

public class Main {

   public static void main(java.lang.String[] args) {

       ArrayList<Integer> bingoDrum = new ArrayList<>(100);
       for (int i = 1; i <= 100; i++) {

           bingoDrum.add(i);// add the numbers 1 to 100 to the drum
       }

       Collections.shuffle(bingoDrum);// Mix it up
       System.out.println ("Your attention, please! Here are the first 10 numbers from the drum!");
       for (int i = 0; i < 10; i++) {

           System.out.println(bingoDrum.get(i));
       }

   }
}
Đầu ra: Chú ý của bạn, xin vui lòng! Đây là 10 số đầu tiên từ trống! 32 61 4 81 25 8 66 35 42 71 Thật dễ dàng! Vấn đề đã được giải quyết và phần trò chơi của chúng ta đã được viết :) Bây giờ hãy tưởng tượng một tình huống khác. Trước đây, chúng tôi đã tạo một solarSystemdanh sách chứa các hành tinh. Và nó dường như phù hợp với chúng tôi về mọi mặt, trừ một điều: bạn có thể xóa các mục khỏi nó và thêm các mục mới ! Đây rõ ràng không phải là hành vi mà chúng ta mong đợi: Hệ mặt trời không thể thay đổi trong chương trình của chúng ta. Lớp này Collectionscó một phương thức rất thú vị: unmodifiableList(). Nó tạo một danh sách bất biến từ danh sách được truyền dưới dạng đối số. Bạn không thể thêm hoặc xóa các mục khỏi danh sách này. Khi xử lý danh sách các hành tinh trong hệ mặt trời, đây chính xác là điều chúng ta muốn!

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       List<String> solarSystem = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(mercury, venus, earth, mars,
               jupiter, saturn, uranus, neptune)));
       solarSystem.add("Pluto");// Try to add a new element
   }
}
Đầu ra: Ngoại lệ trong luồng "chính" java.lang.UnsupportedOperationException tại java.util.Collections$UnmodifiableCollection.add(Collections.java:1075) tại Main.main(Main.java:21) Đây là lỗi: bạn không thể thêm bất cứ điều gì vào solarSystem! Điều duy nhất bạn cần chú ý ở đây là thực tế là phương thức này trả về List<>(không phải ArrayList<>), vì loại này phổ biến cho tất cả các loại danh sách. Một tình huống khá phổ biến khác dễ xảy ra là lập trình viên thêm các phần tử vào sai thứ tự. Nếu điều này xảy ra và chúng ta thấy rằng Sao Thủy và Sao Hải Vương bị lẫn lộn, chúng ta có thể sửa lỗi này bằng phương swap()pháp:

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystem = new ArrayList<>(Arrays.asList(neptune, venus, earth, mars
       , jupiter, saturn, uranus, mercury));// The planets are in the wrong order
       System.out.println(solarSystem);

       Collections.swap(solarSystem, solarSystem.indexOf(mercury), solarSystem.indexOf(neptune));
       System.out.println(solarSystem);

   }
}
Chúng tôi chuyển đến swap()phương thức danh sách của chúng tôi và các chỉ số của hai phần tử cần được hoán đổi. Lưu ý rằng phương pháp này hoạt động với các chỉ số, không phải tham chiếu. Vì vậy, ở đây chúng tôi đã phải sử dụng ArrayList.indexOf()phương pháp. Đầu ra: [Sao Hải Vương, Sao Kim, Trái Đất, Sao Hỏa, Sao Mộc, Sao Thổ, Sao Thiên Vương, Sao Thủy] [Sao Thủy, Sao Kim, Trái Đất, Sao Hỏa, Sao Mộc, Sao Thổ, Sao Thiên Vương, Sao Hải Vương] Cuối cùng, chúng ta sẽ làm quen với một phương pháp rất thú vị : disjoint(). Nó kiểm tra xem hai tập hợp có giao nhau hay không, tức là liệu chúng có ít nhất một phần tử giống nhau hay không . Nếu không, nó trả về true. Họ làm, sau đó nó trả về false

public class Main {

   public static void main(java.lang.String[] args) {

       String mercury = new String("Mercury");
       String venus = new String("Venus");
       String earth = new String("Earth");
       String mars = new String("Mars");
       String jupiter = new String("Jupiter");
       String saturn = new String("Saturn");
       String uranus = new String("Uranus");
       String neptune = new String("Neptune");

       ArrayList<String> solarSystemPart1 = new ArrayList<>(Arrays.asList(mercury, venus, earth, mars));
       ArrayList<String> solarSystemPart2 = new ArrayList<>(Arrays.asList(jupiter, saturn, uranus, neptune));

       System.out.println(Collections.disjoint(solarSystemPart1, solarSystemPart2));

   }
}
Như bạn có thể thấy, hai danh sách của chúng ta có các thành phần hoàn toàn khác nhau, vì vậy chương trình sẽ xuất ra giá trị true . Đây là một lớp học thú vị và rất bổ ích. Giống như Arrays, nó thực hiện rất nhiều công việc thường ngày, tẻ nhạt đối với chúng tôi, để chúng tôi tập trung vào những thứ khác.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION