JavaRush /Blog Java /Random-VI /Lớp mảng và cách sử dụng nó

Lớp mảng và cách sử dụng nó

Xuất bản trong nhóm
Xin chào lần nữa! :) Trong bài học trước, chúng ta đã làm quen với cấu trúc dữ liệu như mảng (mảng Java), học cách tạo mảng, điền dữ liệu vào chúng và cũng học cách chúng được lưu trữ trong bộ nhớ. Hôm nay chúng ta sẽ xem xét một số nhiệm vụ và ví dụ về cách làm việc với mảng mà bạn thường gặp trong công việc thực tế. Ví dụ, hãy tưởng tượng tình huống này: chúng ta có một mảng gồm 10 số được viết theo thứ tự ngẫu nhiên.
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Nhiệm vụ của chúng ta là sắp xếp mảng này theo thứ tự tăng dần: từ số nhỏ nhất đến số lớn nhất. Cuối cùng nó sẽ trông như thế này:
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Chung ta se lam như thê nao? Nhiệm vụ này không hề tầm thường, chúng tôi chưa bao giờ thực hiện việc này trước đây:/ Bạn có ý kiến ​​gì không? Thử đoán. Đây là những gì chúng ta có thể làm, ví dụ:
  • Lặp qua tất cả các phần tử của mảng. So sánh từng phần tử với phần tử tiếp theo ( [0]với [1], [1]với [2], [2]với , [3]v.v.). Nếu phần tử mảng hiện tại lớn hơn phần tử tiếp theo, chúng ta hoán đổi chúng và chuyển sang phần tử tiếp theo. Nếu không, hãy để nguyên như vậy và tiếp tục.

  • Do đó, sau lần đầu tiên duyệt qua các phần tử của mảng, giá trị lớn nhất (167) được đảm bảo nằm ở ô cuối cùng.

  • Bây giờ chúng ta hãy xem lại tất cả các phần tử của mảng, bắt đầu với phần tử có chỉ mục [0], nhưng cho đến phần tử áp chót (số lớn nhất đã ở vị trí của nó) và thực hiện các so sánh và hoán đổi tương tự. 
    Cuối cùng, ở ô áp chót chúng ta sẽ có giá trị cao thứ hai (99).

  • Hãy lặp lại công việc này nhiều lần khi chúng ta trừ đi một phần tử trong mảng.
Lớp mảng và cách sử dụng - 2Chúng tôi nảy ra ý tưởng, tất cả những gì còn lại là viết mã. Nó sẽ trông giống thế này:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       for (int i = numbers.length - 1; i > 0; i--) {
           for (int j = 0; j < i; j++) {
           /* Compare the elements in pairs,
             if they are in the wrong order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Ừm... Có vẻ hơi phức tạp -_- Ngay cả khi nguyên tắc hoạt động chung đã rõ ràng, bạn vẫn phải viết khá nhiều mã để giải quyết một nhiệm vụ tưởng chừng đơn giản như vậy. Được rồi, có lẽ chúng ta đã đánh giá quá cao bản thân mình? Có lẽ nhiệm vụ mà chúng tôi đảm nhận từ trước đến nay quá khó khăn đối với chúng tôi. Hãy thử làm điều gì đó đơn giản hơn. Ví dụ: hãy lấy cùng một dãy số.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Nhiệm vụ của chúng ta là sao chép nội dung của nó sang một mảng khác.
int [] numbersCopy = new int[10];
Hãy nghĩ xem bạn sẽ làm điều này như thế nào bằng cách sử dụng kiến ​​thức về mảng mà bạn đã có? Ví dụ, bạn có thể lặp qua một mảng numbersvà viết từng phần tử của nó vào numbersCopy:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = new int[10];

       for (int i = 0; i < numbers.length; i++) {

           numbersCopy[i] = numbers[i];
       }

   }
}
Chà, ít nhiều chúng ta đã làm được điều đó! Vấn đề dường như đã được giải quyết, nhưng một lần nữa: nếu nó cần được thực thi thường xuyên, mã sẽ có một loạt các vòng lặp giống hệt nhau. Trên thực tế, những vấn đề này và những vấn đề khác đã được giải quyết từ lâu bởi những người tạo ra Java và chúng ta không cần phải “phát minh lại bánh xe” và viết một số mã cho giải pháp của riêng mình.

Lớp mảng Java

Một lớp Java đặc biệt sẽ giúp bạn giải quyết các vấn đề điển hình khi làm việc với mảng - Arrays. Các phương thức đã được thêm vào lớp này để giải quyết các vấn đề phổ biến nhất mà các lập trình viên Java gặp phải trong công việc của họ. Ví dụ: nhiệm vụ sắp xếp một mảng mà bản thân chúng tôi đã cố gắng tìm ra giải pháp có thể được giải quyết trong một dòng:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       Arrays.sort(numbers);

       System.out.println(Arrays.toString(numbers));

   }
}
Phương thức Arrays.sort()sắp xếp mảng. Hơn nữa, thuật toán được nhúng trong đó làm cho việc này hiệu quả hơn nhiều so với mã mà chúng tôi đã viết. Đầu ra của bảng điều khiển:

[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Xin lưu ý: để chuyển đổi mảng thành chuỗi, chúng tôi đã sử dụng một phương thức lớp khác Arrays- Arrays.toString(). Bản thân các mảng Java không ghi đè toString(). Vì vậy, nếu bạn chỉ viết
System.out.println(numbers.toString());
toString()phương thức lớp sẽ được gọi Object. Trong trường hợp mảng, đầu ra sẽ giống như thế này:

[I@4554617c
Bây giờ chúng ta sẽ không đi vào chi tiết tại sao kết luận lại như vậy; điều quan trọng là đây rõ ràng không phải là điều chúng ta cần. Nhưng Arrays.toString() đã làm được điều chúng tôi muốn. Nhân tiện, vấn đề sao chép của chúng tôi cũng được giải quyết dễ dàng trong lớp Arrays:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Đối với phương thức, Arrays.copyOf()chúng ta chuyển mảng ban đầu (từ đó chúng ta cần sao chép các giá trị) và độ dài của mảng mới mà chúng ta sao chép dữ liệu vào. Trong trường hợp này, chúng tôi biểu thị là độ dài numbers.length, bởi vì chúng tôi muốn sao chép toàn bộ mảng. Nếu chỉ muốn sao chép một vài phần tử đầu tiên, chúng ta có thể chỉ định độ dài nhỏ hơn cho mảng mới:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOf(numbers, 4);
       System.out.println(Arrays.toString(numbersCopy));

   }
}
Ở đây chúng ta đã chỉ định độ dài của mảng mới là 4. Theo đó, chỉ 4 phần tử đầu tiên numberssẽ được sao chép sang mảng mới. Đầu ra của bảng điều khiển:

[167, -2, 16, 99]
Nhân tiện, nếu bạn cần sao chép một phần của mảng, nhưng không phải từ đầu mà là "từ giữa", Arraysbạn cũng có thể làm điều này:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};

       int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
       System.out.println(Arrays.toString(numbersCopy));

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

[16, 99, 26, 92]
Các số từ ô hai ( đã bao gồm ) đến ô sáu ( không bao gồm ) đã được sao chép vào mảng mới. Ngoài ra, chúng ta có thể cần so sánh hai mảng với nhau. Cũng giống như phương thức này toString(), bản thân các mảng không ghi đè lên phương thức đó equals(). Vì vậy, nếu chúng ta cố gắng so sánh chúng như thế này:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(numbers.equals(numbers2));
   }
}
chúng tôi nhận được kết quả false. Object.equals()Cuối cùng, phương thức so sánh các liên kết sẽ được gọi . Và tất nhiên là chúng khác nhau! Nhưng chúng ta cần so sánh nội dung của mảng chứ không phải các liên kết. Lớp này Arrayschứa một phương thức được ghi đè equals()thực hiện chính xác những gì chúng ta cần:
public class Main {

   public static void main(String[] args) {

       int[] numbers = {1, 2, 3};
       int[] numbers2 = {1, 2, 3};

       System.out.println(Arrays.equals(numbers, numbers2));
   }
}
Phần kết luận:

true
Nhân tiện, lớp này Arrayshoạt động thành công không chỉ với mảng thông thường mà còn với mảng hai chiều:
public class Main {

   public static void main(String[] args) {

       int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

       int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);

       System.out.println("Are these two-dimensional arrays equal to each other?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Phần kết luận:

Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Như bạn có thể thấy, phương thức này Arrays.copyOf()xử lý việc sao chép một mảng hai chiều. Xin lưu ý rằng trong trường hợp này, khi sao chép một mảng hai chiều, cái gọi là "bản sao nông" sẽ xảy ra. Và để so sánh các mảng hai chiều và xuất chúng ra bàn điều khiển, các phương thức đặc biệt được cung cấp - deepEqualsdeepToString(); Trong tương lai, bạn sẽ thấy nhiều lần (và rất vui vì điều đó) rằng những người tạo ra Java đã thấy trước rất nhiều tình huống điển hình mà các lập trình viên gặp phải khi làm việc và triển khai các giải pháp làm sẵn cho chúng bằng ngôn ngữ. Sử dụng những giải pháp này dễ dàng và thuận tiện hơn nhiều so với việc phát minh lại bánh xe phải không? :) Hãy chắc chắn đọc tài liệu lớp Arraystrên trang web của Oracle . Chúc may mắn với các nghiên cứu của bạn!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION