JavaRush /Blog Java /Random-VI /Bộ sưu tập trong Java | Bộ sưu tập Java

Bộ sưu tập trong Java | Bộ sưu tập Java

Xuất bản trong nhóm
Xin 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, trong thời gian này chúng tôi chỉ thực hiện những thao tác đơn giản nhất: xóa, chèn, xuất ra bàn điều khiển. Tất nhiên, đây chưa phải là phần cuối của danh sách các vấn đề mà các nhà phát triển gặp phải khi sử dụng ArrayList . Bạn có nhớ bài giảng về mảng và lớp Mảng không? Nó được phát triển bởi những người tạo ra Java đặc biệt để giải quyết các vấn đề phổ biến mà các lập trình viên gặp phải khi làm việc với mảng. Còn ArrayList thì sao ? Chắc chắn cũng có một số danh sách các nhiệm vụ điển hình dành cho anh ấy. Tất cả chúng đều được triển khai trong một số lớp riêng biệt hay chúng ta sẽ phải viết hành vi mong muốn theo cách thủ công mỗi lần? Tất nhiên, bạn không cần phải tự viết mọi thứ. Các thao tác phổ biến nhất được thực hiện khi sử dụng các bộ sưu tập trong Java đã được triển khai trong Bộ sưu tập lớp tĩnh đặc biệt. Bộ sưu tập lớp - 1

Bộ sưu tập trong Java

“Bộ sưu tập” là tên chung cho một số cấu trúc dữ liệu trong Java. 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 lớp ArrayList , nơi dữ liệu được lưu trữ dưới dạng mảng. Chúng ta sẽ làm quen với phần còn lại của bộ sưu tập sau. Bây giờ đủ để hiểu rằng lớp Bộ sưu tập được thiết kế để hoạt động không chỉ với ArrayList mà còn với các loại bộ sưu tập khác trong Java (do đó, trên thực tế, có tên của nó). Vậy lớp Collections cho phép bạn giải quyết những nhiệm vụ gì khi làm việc với ArrayList? Việc đầu tiên và rõ ràng nhất là sắp xếp. Trong bài giảng về mảng, chúng ta đã xem xét một ví dụ về các con số và bây giờ hãy xem một ví dụ về các chuỗi. Để sắp xếp nội dung của các bộ sưu tập, lớp Bộ sưu tập thực hiện phương thức sau sort():
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);

   }
}
Phần kết luận:

[Венера, Земля, Марс, Меркурий, Нептун, Сатурн, Уран, Юпитер]
Các dòng đã được sắp xếp theo thứ tự bảng chữ cái! Tại sao theo thứ tự bảng chữ cái? Lớp này Stringđược lập trình để xác định chính xác cách so sánh các chuỗi với nhau (chính xác 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 cơ chế 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 giảng khác. Ngoài ra, lớp Bộ sưu tập cho phé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 min()và các phương thức 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));

}
Phần kết luận:

7
1
Tất nhiên, điều này thuận tiện hơn nhiều so với việc viết mã thủ công để xem qua tất cả các phần tử và tìm kiếm phần tử lớn nhất/nhỏ nhất :) Một phương pháp cực kỳ hữu ích khác là reverse(). Nếu chúng ta cần “đảo ngược” một danh sách để các phần tử 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ự mình viết một thuật toán như vậy :) May mắn thay, phương pháp này reverse()đã biết cách thực hiện điều này. Ví dụ: chúng tôi không thích cách phương pháp này sort()sắp xếp các hành tinh của chúng tôi theo thứ tự bảng chữ cái và chúng tôi muốn thay đổi thứ tự ngược lại - từ Z thành 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);

   }
}
Phần kết luận:

[Юпитер, Уран, Сатурн, Нептун, Меркурий, Марс, Земля, Венера]
Nhân tiện, ở đây chúng ta thường nói về việc sắp xếp, thứ tự các phần tử, v.v. Điều gì sẽ xảy ra nếu nhiệm vụ của chúng ta hoàn toàn ngược lại? Ví dụ: chúng tôi đang cố gắng thực hiện cơ chế xổ số. Chúng tôi đã thêm 100 số vào guồng, số này sẽ xuất hiện lần lượt trên màn hình. Người tham gia đầu tiên gạch bỏ tất cả các số trên vé của họ sẽ thắng. Rất dễ dàng để thực hiện một cơ chế như vậy bằng phương pháp shuffle():
public class Main {

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

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

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

       Collections.shuffle(lottery);//mix
       System.out.println("Attention! The first 10 numbers appear from the drum!");
       for (int i = 0; i < 10; i++) {

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

   }
}
Phần kết luận:

Внимание! Из барабана появляются первые 10 чисел!
32
61
4
81
25
8
66
35
42
71
Nó đơn giản mà! Vấn đề đã được giải quyết và phần trò chơi của chúng ta đã được viết ra :) 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 danh sách solarSystemcó các hành tinh được liệt kê trong đó. Và nó có vẻ phù hợp với tất cả chúng ta, nếu không phải vì một điều: bạn có thể xóa các phần tử khỏi nó và thêm các phần tử mới! Đây rõ ràng không phải là hành vi mà chúng tôi mong đợi: hệ mặt trời trong chương trình của chúng tôi phải ở trạng thái không thay đổi. Lớp Bộ sưu tập có một phương thức rất thú vị - unmodifiableList(). Nó tạo ra một phiên bản bất biến của danh sách đã cho. Sẽ không thể thêm hoặc bớt một phần tử vào nó. Trong trường hợp danh sách các hành tinh của hệ mặt trời, đây chính xác là những gì chúng ta cầ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
   }
}

Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableCollection.add(Collections.java:1075)
	at Main.main(Main.java:21)
Lỗi: solarSystemBây giờ bạn không thể thêm bất cứ thứ gì! Điều duy nhất bạn cần chú ý trong trường hợp này là loại của biến phải là List<>, chứ không phải ArrayList<>(phương thức này trả về một đối tượng thuộc loại chính xác này, phổ biến cho tất cả các loại danh sách). Một tình huống phổ biến khác có thể xảy ra trong quá trình làm việc là lập trình viên đã thêm các phần tử không đúng thứ tự. Nếu điều này xảy ra và sao Thủy và sao Hải Vương bất ngờ đổi chỗ, phương pháp sau sẽ giúp chúng ta sửa lỗi này swap():
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));// wrong planet order
       System.out.println(solarSystem);

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

   }
}
Chúng tôi đã chuyển danh sách của mình cho phương thức swap(), cũng như chỉ mục của hai phần tử cần được hoán đổi. Xin lưu ý: phương pháp này hoạt động cụ thể với các chỉ mục chứ không phải với các liên kết. Vì vậy, ở đây chúng tôi cần một phương pháp ArrayList.indexOf(). Phần kết luận:

[Нептун, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Меркурий]

[Меркурий, Венера, Земля, Марс, Юпитер, Сатурн, Уран, Нептун]
Cuối cùng, chúng ta hãy làm quen với một phương pháp rất thú vị - disjoint(). Nó kiểm tra xem hai bộ sưu tập có giao nhau hay không, nghĩa là có ít nhất một phần tử giống hệt nhau. Nếu không thì trả về true, nếu có thì 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, các phần tử trong hai danh sách của chúng ta hoàn toàn khác nhau, do đó chương trình xuất ra các tệp true. Đây là một lớp học thú vị và rất hữu ích. Giống như Arrays, anh ấy làm rất nhiều công việc thường ngày, tầm thường cho chúng tôi, cho phép chúng tôi tập trung vào những việc khác. Đọc về nó trong tài liệu của Oracle , có những phương pháp khác ở đó.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION