JavaRush /Blog Java /Random-MS /Analisis terperinci kelas ArrayList [Bahagian 2]
Vonorim
Tahap

Analisis terperinci kelas ArrayList [Bahagian 2]

Diterbitkan dalam kumpulan
Malangnya, semua maklumat tidak dimuatkan ke dalam satu artikel, jadi kami terus melihat kaedah baki kelas ArrayList. Isih koleksi:
public void sort(Comparator< ? super E> c)
Isih senarai mengikut peraturan yang diberikan. Peraturan isihan ialah antara muka Pembanding yang dilaksanakan dengan compare(). Penggantian diperlukan jika koleksi mengandungi objek kelasnya sendiri. Apabila bekerja dengan kelas standard (Integer, String dan sebagainya), penggantian perbandingan biasanya hanya diperlukan untuk pengisihan bukan standard. 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 tulis pembanding mudah yang akan membandingkan id pelajar:
class StudentIdComparator implements Comparator<student>{

 public int compare(Student e1, Student e2) {
  return e1.id.compareTo(e2.id);
 }
}
Mari buat senarai untuk pelajar dan objek kelas yang melaksanakan Comparator:
ArrayList<Student> myList = new ArrayList<> ();
StudentIdComparator comparator = new StudentIdComparator();
Mari kita panggil kaedah sortuntuk senarai kami dan berikan pembanding kepadanya:
myList.sort(comparator);
Ini akan menukar senarai asal [4 David, 2 Tom, 5 Rohit, 1 Paul, 3 Vishal] kepada [1 Paul, 2 Tom, 3 Vishal, 4 David, 5 Rohit]. Terakhir saya meninggalkan kaedah yang sangat menarik, tetapi jarang digunakan:
public List<E> subList(int fromIndex, int toIndex)
Ia tidak mengembalikan senarai baharu, seperti yang kelihatannya, tetapi paparan senarai (subsenarai) yang kaedah ini dipanggil, supaya kedua-dua senarai akan berkongsi elemen yang disimpan. subList ialah senarai berfungsi sepenuhnya; ia juga berfungsi untuk menulis, membuat perubahan yang sesuai pada senarai induk. Ciri-ciri cemerlang berikut dari ini:
someList.subList(3, 7).clear();
Dalam contoh ini, someListempat elemen akan dialih keluar daripada senarai, daripada yang ketiga hingga ketujuh (tidak termasuk). Kami menunjukkan julat untuk bekerja dengan senarai dan kami pergi. Di dalam kaedah, pada dasarnya, terdapat panggilan ke kelas SubList, yang mempunyai pelaksanaan sendiri kaedah yang diketahui, dan sebagai hasil daripada operasi kaedah, objek kelas ini dikembalikan. Pelaksanaan kelas itu sendiri boleh dilihat dalam kod sumber . Untuk menyatukan bahan, saya cadangkan anda menulis pelaksanaan tatasusunan dinamik anda sendiri. Ini akan sangat berguna pada masa hadapan. Sebagai contoh, saya membentangkan pelaksanaan tatasusunan dinamik saya untuk nombor sahaja, dengan komen dalam kod.
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;
    }
}
Senarai sumber yang digunakan:
  1. Kod sumber ArrayList (semasa - JDK 12);
  2. Kebanyakan ilustrasi diambil dari sini dan beberapa artikel dari JavaRush;
  3. Artikel mengenai Habré .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION