CodeGym/Java Blog/Acak/kelas Array
John Squirrels
Level 41
San Francisco

kelas Array

Dipublikasikan di grup Acak
anggota
Halo lagi! :) Dalam pelajaran hari ini, kita akan berbicara tentang kelas Array di Java. Dalam pelajaran terakhir, kita mengenal struktur data yang disebut array. Kami belajar cara membuatnya dan mengisinya dengan data. Dan kami melihat bagaimana mereka disimpan dalam memori. Hari ini kita akan melihat beberapa tugas dan contoh bekerja dengan array yang akan sering Anda lihat dalam pekerjaan nyata. Misalnya, bayangkan situasi ini: Kami memiliki larik 10 angka acak.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Tugas kita adalah mengurutkan array ini dalam urutan menaik: dari yang terkecil ke yang terbesar. Pada akhirnya, akan terlihat seperti ini: [-234, -2, 16, 26, 35, 43, 92, 99, 167] Bagaimana caranya? Tugas ini tidak sepele. Kami belum pernah melakukan ini sebelumnya :/ Ada ide? Mencoba menebak. Inilah salah satu solusinya:
  • Telusuri semua elemen array. Bandingkan setiap elemen dengan berikutnya ([0] dengan [1], [1] dengan [2], [2] dengan [3], dst.). Jika elemen saat ini lebih besar dari yang berikutnya, kami menukarnya, lalu beralih ke elemen berikutnya. Jika tidak, biarkan apa adanya, dan lanjutkan
  • Jadi, setelah melewati elemen pertama, nilai terbesar (167) dijamin berada di sel terakhir.
  • Sekarang kita akan membahas semua elemen lagi, tetapi kali ini kita akan mulai dengan indeks [0] ke elemen kedua dari belakang (angka terbesar sudah ada di tempatnya) dan membuat perbandingan dan pertukaran yang sama. Setelah lulus ini, di sel kedua dari belakang, kita akan memiliki nilai terbesar kedua (99).
  • Ulangi proses ini sebanyak yang kita punya elemen array.
Kami punya ide. Sekarang kita hanya perlu menulis kodenya. Ini terlihat seperti ini: Kelas array dan penggunaannya - 2
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 not in the right order,
             then swap them */
               if (numbers[j] > numbers[j + 1]) {
                   int tmp = numbers[j];
                   numbers[j] = numbers[j + 1];
                   numbers[j + 1] = tmp;
               }
           }
       }

   }
}
Uh ... Kelihatannya agak rumit -_- Meskipun prinsip umumnya dapat dimengerti, kami masih harus menulis cukup banyak kode untuk menyelesaikan tugas yang begitu sederhana. Oke, mungkin kita terlalu melebih-lebihkan diri kita sendiri? Tugas yang telah kami tangani mungkin masih terlalu rumit bagi kami. Mari kita coba sesuatu yang lebih sederhana. Misalnya, ambil larik angka yang sama.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Tugas kita adalah menyalin isinya ke array lain.
int [] numbersCopy = new int[10];
Pikirkan tentang bagaimana Anda melakukannya dengan menggunakan apa yang sudah Anda ketahui tentang array? Misalnya, Anda bisa menelusuri array angka dalam satu lingkaran dan secara berurutan menulis elemennya ke dalam angkaCopy :
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];
       }

   }
}
Nah, eh, di sini pada dasarnya kita sudah melakukannya! Sepertinya kita telah memecahkan masalah. Namun, jika Anda sering melakukannya, kode Anda akan memiliki banyak loop yang identik. Faktanya, tugas-tugas ini (dan lainnya) telah lama diselesaikan oleh pencipta Java. Kami tidak perlu "menemukan kembali roda" dan membuat kode solusi kami sendiri. Ada kelas statis khusus ( Arrays ) untuk membantu Anda melakukan tugas-tugas umum saat bekerja dengan array. Metode untuk melakukan tugas paling umum yang dihadapi oleh pemrogram Java telah ditambahkan ke kelas ini. Misalnya, tugas menyortir array, yang kami coba tangani, diselesaikan dalam satu baris:
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));

   }
}
Metode Arrays.sort () mengurutkan array. Dan algoritmenya jauh lebih efisien daripada kode yang kami tulis. Output konsol: [-234, -2, 16, 26, 35, 43, 80, 92, 99, 167] Catatan: Untuk mengonversi array menjadi string, kami menggunakan metode lain dari kelas Array : Arrays.toString() . Array di Java tidak mengganti metode toString() dengan sendirinya. Jadi, jika Anda hanya menulis
System.out.println(numbers.toString());
toString() kelas Objek akan dipanggil. Untuk sebuah array, keluarannya akan seperti ini: [I@4554617c Kami tidak akan menjelaskan secara mendetail sekarang tentang mengapa tepatnya ini adalah keluarannya. Hal utama adalah jelas bukan itu yang kita butuhkan. Tapi Arrays.toString() melakukan apa yang kita inginkan. Omong-omong, penyalinan juga mudah dilakukan dengan kelas 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));

   }
}
Kami meneruskan ke metode Arrays.copyOf() array asli kami (dari mana kami ingin menyalin nilai) dan panjang array baru tempat kami menyalin data. Dalam hal ini, kami menunjukkan angka.panjang sebagai panjang, karena ingin menyalin seluruh larik. Jika kami hanya ingin menyalin beberapa elemen pertama, kami dapat menentukan panjang array baru yang lebih kecil:
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));

   }
}
Di sini kami menentukan 4 sebagai panjang dari array baru. Karenanya, hanya 4 elemen angka pertama yang akan disalin ke larik baru. Output konsol: [167, -2, 16, 99] Omong-omong, Array juga memungkinkan Anda menyalin bagian dari array dari tengah daripada awal array:
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));

   }
}
Keluaran: [16, 99, 26, 92] Angka disalin ke dalam larik baru dari larik kedua dari elemen kedua (inklusif) hingga keenam (tidak inklusif). Kita mungkin juga perlu membandingkan dua larik. Seperti dengan metode toString() , array itu sendiri tidak menggantikan metode equals() . Jadi jika kita mencoba membandingkannya seperti ini
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));
   }
}
maka kita salah. Ini karena Object.equals() , yang membandingkan referensi, akan dipanggil. Dan, jelas, mereka berbeda! Tapi yang kita butuhkan adalah membandingkan konten array, bukan referensi. Kelas Array menimpa metode equals() untuk membuatnya melakukan apa yang kita inginkan:
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));
   }
}
Keluaran: benar Omong-omong, kelas Array bekerja tidak hanya dengan larik biasa, tetapi juga dengan larik dua dimensi:
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?");
       System.out.println(Arrays.deepEquals(numbers, numbersCopy));

       System.out.println(Arrays.deepToString(numbersCopy));
   }
}
Output: Apakah array dua dimensi ini sama? true [[1, 2, 3], [4, 5, 6], [7, 8, 9]] Seperti yang Anda lihat, metode Arrays.copyOf() dapat menyalin array dua dimensi. Dan kelas memiliki metode khusus untuk membandingkan dan menampilkan array dua dimensi: deepEquals dan deepToString() . Di masa mendatang, Anda akan berulang kali melihat (dan bersukacita karena fakta bahwa) pencipta Java mengantisipasi banyak situasi yang sering dihadapi oleh pemrogram, dan mengimplementasikan solusi siap pakai untuk mereka dalam bahasa tersebut. Menggunakan solusi ini jauh lebih mudah dan nyaman daripada menemukan kembali roda, bukan? :) Pastikan untuk membaca dokumentasi untuk kelas Arrays di situs web Oracle . Semoga berhasil dalam studi Anda!
Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar