Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Làm chủ Java ArrayList:Hướng dẫn toàn diện để xử lý dữ liệu hiệu quả

ArrayLists đã là một chủ đề thịnh hành trong Java. Chúng cung cấp cho bạn nhiều lợi ích hơn so với mảng tiêu chuẩn. ArrayLists cho phép bạn lưu trữ các đối tượng liên tiếp một cách hiệu quả và xóa chúng khi không cần thiết. Chúng cũng giúp bạn thực hiện các thao tác tiêu chuẩn trên danh sách của bạn như sắp xếp và tìm kiếm. Nếu sử dụng mảng tiêu chuẩn, bạn sẽ phải viết logic của riêng mình cho các thao tác này, việc này đòi hỏi phải có thêm thời gian và sự cẩn thận.

Nhờ có danh sách dài các lợi ích, ArrayLists có ứng dụng trong nhiều trường hợp. Tuy nhiên, một thao tác quan trọng không có sẵn trong ArrayLists là in. ArrayLists có thể bao gồm các kiểu dữ liệu tiêu chuẩn, nguyên thủy (như số nguyên và chuỗi) hoặc các kiểu dữ liệu nâng cao hơn, như các lớp tùy chỉnh. Trong mỗi trường hợp này, việc in ArrayList yêu cầu các bước khác nhau.

Trong bài viết này, chúng ta sẽ xem xét ba cách hàng đầu để in ArrayList trong Java, bao gồm hai loại ArrayList mà chúng ta đã thảo luận ở trên. Không dài dòng nữa, hãy bắt đầu!

In Java ArrayList:Ba cách

Như đã đề cập ở trên, có hai loại ArrayList:một loại chứa các đối tượng có kiểu dữ liệu nguyên thủy, đơn giản (như số nguyên và số float) và loại kia chứa các đối tượng được khởi tạo thông qua các lớp tùy chỉnh. Có một số cách để in hai loại ArrayLists này.

Đây là ba cách hàng đầu để in ArrayList trong Java:

  • Sử dụng vòng lặp for
  • Sử dụng lệnh println
  • Sử dụng toString() thực hiện

Phương pháp 1:Sử dụng vòng lặp for

Vòng lặp for là một trong những cách đơn giản nhất để lặp qua danh sách hoặc mảng. Phương pháp này hoạt động tốt với các mảng đơn giản cũng như ArrayLists, vì việc lặp qua tất cả các mục một cho phép bạn xử lý từng mục một cách phù hợp.

Phương pháp này giúp bạn xác định cách triển khai cụ thể cho từng thành phần. Sau đây là cú pháp của vòng lặp for:

for (int i=0; i<arr.size(); i++) {
 // Assuming arr is an ArrayList object
 int current = arr.get(i);
 // Do something with the current element here
}

Bây giờ chúng ta hãy xem một số cách phổ biến mà vòng lặp for có thể được sử dụng để duyệt qua một mảng đối tượng:

ví dụ về vòng lặp

Bạn có thể sử dụng vòng lặp for để in tất cả các phần tử của ArrayList:

ArrayList<Integer> arr = new ArrayList<>();
arr.add(3);
arr.add(4);
arr.add(5);
arr.add(6);
for (int i=0; i<arr.size(); i++) {
 int curr = arr.get(i);
 System.out.println(curr);
}

Để nâng cao mức độ này, bạn có thể xác định các trường hợp cụ thể cho từng thành phần dựa trên bất kỳ điều kiện nào:

ArrayList arr = new ArrayList<>();
arr.add(3);
arr.add(5l);
arr.add("Hello World!");
 for (int i=0; i<arr.size(); i++) {
 if (arr.get(i) instanceof Integer)
 System.out.println(arr.get(i) + " is a number");
 else if (arr.get(i) instanceof String)
 System.out.println(arr.get(i) + " is a string");
 else if (arr.get(i) instanceof Long)
 System.out.println(arr.get(i) + " is a long");
}

Khi nào nên sử dụng phương pháp này

Vòng lặp for phù hợp nhất với các tình huống khi bạn có tập hợp các phần tử tương đối ngắn hơn và kiểu của chúng không khác nhau nhiều. Nếu bạn có một danh sách gồm 20 mục là số nguyên (int) hoặc chuỗi, thì vòng lặp for là cách tốt nhất. Nếu bạn có một danh sách hơn 100 mục có thể là chuỗi, int, boolean hoặc bất cứ thứ gì khác thì vòng lặp for sẽ quá cồng kềnh để sử dụng.

Phương pháp 2:Sử dụng lệnh println

println lệnh có thể được sử dụng trực tiếp trong trường hợp ArrayLists được tạo bằng các kiểu dữ liệu nguyên thủy. Các kiểu dữ liệu nguyên thủy trong Java bao gồm chuỗi, số nguyên, float, long, double và boolean. Nếu một danh sách bao gồm dữ liệu không khớp với các loại này thì không thể in nó bằng phương pháp này.

Cú pháp của phương pháp này rất đơn giản:

System.out.println(arr);
// Assuming arr is an ArrayList object

Lý do phương pháp này hoạt động là vì tất cả các kiểu dữ liệu nguyên thủy có thể được in trực tiếp đến thiết bị đầu ra tiêu chuẩn. Chúng không cần phải được phân tích cú pháp thành định dạng có thể in được. Các dữ liệu khác, chẳng hạn như dữ liệu được lưu trữ trong một phiên bản của một lớp tùy chỉnh, không thể được phân tích cú pháp trực tiếp bằng lệnh println, vì vậy phương thức này sẽ không hoạt động trong trường hợp này.

Ví dụ println

Nếu bạn đang cố in một ArrayList số nguyên đơn giản, đây là cách bạn sẽ thực hiện:

ArrayList<Integer> arr = new ArrayList<>();
arr.add(5);
arr.add(4);
arr.add(6);
System.out.println(arr);
# => [5, 4, 6]

Nếu bạn đang cố in một ArrayList không đồng nhất, điều đó cũng có tác dụng:

ArrayList<> arr = new ArrayList<>();
arr.add(7);
arr.add("Foo");
arr.add(12l);
System.out.println(arr);
# => [7, Foo, 12]

Khi nào nên sử dụng phương pháp này

Phương pháp này phù hợp nhất với các tình huống khi bạn có một danh sách các mục ngắn, đơn giản và bạn muốn in nó ra cho mục đích gỡ lỗi. Lưu ý rằng phương pháp này không linh hoạt như phương pháp trước và bạn không thể định dạng nội dung được in ra thiết bị đầu ra. 

Ngoài ra, nếu danh sách chứa bất kỳ dữ liệu không nguyên thủy nào, giá trị của nó sẽ không được in ra thiết bị. Thay vào đó, một con trỏ tới vị trí của nó trong bộ nhớ sẽ được in ra.

class Foo {
 int bar;
 public Foo(int bar){ this.bar = bar; };
}
ArrayList<> arr = new ArrayList<>();
arr.add(4);
arr.add(new Foo(40));
System.out.println(arr);
# => [4, 34n2dsf@Foo];

Phương pháp 3:Triển khai phương thức toString()

Phương pháp này không có nhược điểm của phương pháp trước. Lý do không thể in trực tiếp các đối tượng không nguyên thủy ra đầu ra là do trình biên dịch không biết cách in chúng. toString() phương thức cho phép bạn báo cho trình biên dịch cách in các đối tượng của một lớp ra dòng lệnh.

Hãy lấy lớp Foo từ ví dụ cuối cùng:

class Foo {
 int bar;
 public Foo(int bar){ this.bar = bar; };
}

Để làm cho tính năng này thân thiện với bản in, bạn cần ghi đè và xác định toString() phương thức trong định nghĩa lớp:

class Foo {
 int bar;
 public Foo(int bar){ this.bar = bar; };
 public String toString() {
 return "Bar: " + String.valueOf(bar);
 }
}

Bây giờ nếu bạn thử tạo một phiên bản của Foo:

Và in nó:

Bạn sẽ nhận được kết quả mà bạn đã xác định trước đó:

Bản sửa lỗi nhỏ này có thể được kết hợp với phương thức println để in tất cả các loại ArrayLists một cách dễ dàng và nhanh chóng.

Ví dụ về toString()

Hãy lấy ví dụ cuối cùng từ phương pháp 2 và làm cho nó thân thiện với bản in:

class Foo {
 int bar;
 public Foo(int bar){ this.bar = bar; };
}
ArrayList<> arr = new ArrayList<>();
arr.add(4);
arr.add(new Foo(40));
System.out.println(arr);
# => [4, Foo@2a139a55];

Thay đổi duy nhất bạn cần thực hiện ở đây là thêm toString() định nghĩa trong lớp Foo:

Làm chủ Java ArrayList:Hướng dẫn toàn diện để xử lý dữ liệu hiệu quả

"Nghề nghiệp đã bước vào cuộc đời tôi khi tôi cần nó nhất và nhanh chóng giúp tôi tham gia chương trình đào tạo. Hai tháng sau khi tốt nghiệp, tôi đã tìm được công việc mơ ước phù hợp với các giá trị và mục tiêu trong cuộc sống của mình!"

Venus, Kỹ sư phần mềm tại Rockbot

Tìm trận đấu Bootcamp của bạn

class Foo {
 int bar;
 public Foo(int bar){ this.bar = bar; };
 public String toString(){
 return "Value: " + String.valueOf(bar);
 }
}
Now, the println statement will give the desired output:
// # => [4, Value: 40]

Khi nào nên sử dụng phương pháp này

Phương pháp này phù hợp với các tình huống mà bạn cần in các ArrayList không đồng nhất hoặc ArrayList đồng nhất được tạo thành từ một lớp tùy chỉnh. Một định nghĩa phương thức duy nhất trong lớp giúp bạn tránh khỏi những rắc rối mà bạn sẽ gặp phải khi sử dụng vòng lặp for.

Tuy nhiên, phương pháp này có vẻ như quá mức cần thiết trong những tình huống đơn giản hơn. Nếu bạn có một danh sách nhỏ các phần tử, bạn có thể cân nhắc sử dụng phương thức vòng lặp for để dễ dàng và đơn giản về mặt logic.

Kết luận

In một Java ArrayList không phải là một nhiệm vụ đơn giản. Nội dung của ArrayList càng linh hoạt thì càng khó in danh sách ra đầu ra tiêu chuẩn. println lệnh có thể bao gồm hầu hết các trường hợp, nhưng bạn cũng có thể cần toString() ghi đè để hoàn thành công việc.

Trong bài viết này, chúng tôi đã đề cập đến ba cách in ArrayList. Chúng tôi đã xem xét cú pháp, ví dụ và tình huống mà chúng phù hợp nhất. Để có thêm tài nguyên Java nâng cao, hãy khám phá hướng dẫn của chúng tôi về cách học Java.