JavaRush /Java Blog /Random-ID /Analisis mendetail dari kelas ArrayList [Bagian 2]
Vonorim
Level 26

Analisis mendetail dari kelas ArrayList [Bagian 2]

Dipublikasikan di grup Random-ID
Sayangnya, semua informasi tidak muat dalam satu artikel, jadi kami terus melihat metode lain dari kelas ArrayList. Urutkan koleksi:
public void sort(Comparator< ? super E> c)
Urutkan daftar berdasarkan aturan tertentu. Aturan pengurutan adalah antarmuka Komparator yang diimplementasikan dengan compare(). Penggantian diperlukan jika koleksi berisi objek dari kelasnya sendiri. Saat bekerja dengan kelas standar (Integer, String, dan seterusnya), penggantian perbandingan biasanya hanya diperlukan untuk pengurutan non-standar. Mari buat kelas Student:
class Student{
 String student_name;
 int id;

 Student(int id, String  student_name){
  this.id = id;
  this.student_name = student_name;
 }

 public String toString(){
  return id + " " + student_name;
 }
}
Mari kita tulis pembanding sederhana yang akan membandingkan id siswa:
class StudentIdComparator implements Comparator<student>{

 public int compare(Student e1, Student e2) {
  return e1.id.compareTo(e2.id);
 }
}
Mari kita buat daftar untuk siswa dan objek kelas yang mengimplementasikan Comparator:
ArrayList<Student> myList = new ArrayList<> ();
StudentIdComparator comparator = new StudentIdComparator();
Mari kita panggil metode sortuntuk daftar kita dan meneruskan komparator ke sana:
myList.sort(comparator);
Ini akan mengubah daftar asli [4 David, 2 Tom, 5 Rohit, 1 Paul, 3 Vishal] menjadi [1 Paul, 2 Tom, 3 Vishal, 4 David, 5 Rohit]. Untuk yang terakhir saya meninggalkan metode yang sangat menarik, tetapi jarang digunakan:
public List<E> subList(int fromIndex, int toIndex)
Ini tidak mengembalikan daftar baru, seperti yang terlihat, tetapi tampilan daftar (sublist) yang digunakan untuk memanggil metode ini, sehingga kedua daftar akan berbagi elemen yang disimpan. subList adalah daftar yang berfungsi penuh; ia juga berfungsi untuk menulis, membuat perubahan yang sesuai pada daftar induk. Properti luar biasa mengikuti dari ini:
someList.subList(3, 7).clear();
Dalam contoh ini, someListempat elemen akan dihapus dari daftar, dari elemen ketiga hingga ketujuh (tidak inklusif). Kami menunjukkan kisaran untuk bekerja dengan daftar dan berangkat. Di dalam metode, pada dasarnya, ada panggilan ke kelas SubList, yang memiliki implementasi sendiri dari metode yang diketahui, dan sebagai hasil dari operasi metode tersebut, objek dari kelas ini dikembalikan. Implementasi dari kelasnya sendiri dapat dilihat pada source codenya . Untuk mengkonsolidasikan materi, saya sarankan Anda menulis implementasi array dinamis Anda sendiri. Ini akan sangat berguna di masa depan. Sebagai contoh, saya menyajikan implementasi array dinamis untuk angka saja, dengan komentar di kodenya.
public class IntegerArrayList {

    private int [] elements;  //массив, для хранения чисел
    private int size;  //поле-счетчик, которое указывает на количество элементов в массиве
    private static final int DEFAULT_CAPACITY = 10;  //размер массива по умолчанию

    //конструктор без параметров, который создает массив на 10 элементов, если размер не был указан
    public IntegerArrayList(){  //
        this.elements = new int[DEFAULT_CAPACITY];
    }

    //создает массив указанной емкости
    public IntegerArrayList(int initialCapacity){
        if (initialCapacity >= 0){
            this.elements = new int[initialCapacity];
        }
        else {
            throw new IllegalStateException("Capacity can't be less than 0!");
        }
    }

    //получает элемент по указанному индексу
    public int get(int index){
        isIndexExist(index);  //проверка корректности введенного индекса
        return elements[index];
    }

    //возвращает количество элементов в списке
    public int size (){
        return size;
    }

    //добавляем элемент в конец списка
    public boolean add(int value){
        if (size == elements.length){  //если в массиве места нет
            elements = increaseCapacity(); //вызываем метод, который отвечает за увеличение массива
        }
        elements[size] = value; //записываем в конец списка новое meaning
        size++;  //увеличиваем meaning переменной размера списка
        return true;
    }

    //дополнительный закрытый метод для увеличения емкости массива
    private int [] increaseCapacity(){
        int [] temp = new int[(elements.length * 2)];  //создаем новый массив большего размера
        System.arraycopy(elements, 0, temp, 0, elements.length);  //копируем в новый массив элементы из старого массива
        return temp;
    }

    //устанавливает элемент на указанную позицию
    public int set(int value, int index){
        isIndexExist(index);
        int temp = elements[index];
        elements[index] = value;
        return temp;
    }

    //переопределил метод для красивого вывода списка на экран, иначе будут выводиться значения незаполненных ячеек [1, 10] instead of [1, 10, 0, 0...]
    @Override
    public String toString(){
        int [] temp = new int[size];
        System.arraycopy(elements, 0, temp, 0, size);
        return Arrays.toString(temp);
    }

    //проверяем индексы, не выходят ли они за границы массива
    private int isIndexExist(int index){
        if (index >= size || index < 0){
            throw new IndexOutOfBoundsException("Element can't be found! "
                    + "Number of elements in array = " + size
                    + ". Total size of array = " + elements.length);
        }
        return index;
    }

    //проверяем, есть ли элементы в списке
    public boolean isEmpty(){
        return (size == 0);
    }

    //удаляем элемент по индексу
    public int remove (int index){
        isIndexExist(index);  //проверяем индекс
        int [] temp = elements;  //во временный массив заносим ссылку на текущий массив
        elements = new int [temp.length-1];  //полю elements присваиваем ссылку на новый массив размером меньше на 1
        int value = temp[index];  //сохраняем в доп. переменную meaning удаляемого element
        System.arraycopy(temp, 0, elements, 0, index);  //копируем левую часть массива до указанного индекса
        System.arraycopy(temp, index + 1, elements, index, temp.length - index - 1);  //копируем правую часть массива после указанного индекса
        size--;  //уменьшаем meaning переменной
        return value;
    }
}
Daftar sumber yang digunakan:
  1. Kode sumber ArrayList (saat ini - JDK 12);
  2. Sebagian besar ilustrasi diambil dari sini dan beberapa artikel dari JavaRush;
  3. Artikel tentang Habré .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION