JavaRush /وبلاگ جاوا /Random-FA /تجزیه و تحلیل دقیق کلاس ArrayList [بخش 2]
Vonorim
مرحله

تجزیه و تحلیل دقیق کلاس ArrayList [بخش 2]

در گروه منتشر شد
متأسفانه، تمام اطلاعات در یک مقاله قرار نگرفت، بنابراین ما به بررسی روش های باقی مانده از کلاس ArrayList ادامه می دهیم. مجموعه مرتب سازی:
public void sort(Comparator< ? super E> c)
لیست را بر اساس یک قانون مشخص مرتب می کند. یک قانون مرتب‌سازی، یک رابط مقایسه‌کننده پیاده‌سازی‌شده با یک لغو است compare(). اگر مجموعه شامل اشیایی از کلاس خودش باشد، بازنویسی ضروری است. هنگام کار با کلاس های استاندارد (Integer، String و غیره)، override مقایسه معمولاً فقط برای مرتب سازی غیر استاندارد مورد نیاز است. بیایید یک کلاس ایجاد کنیم 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;
 }
}
بیایید یک مقایسه کننده ساده بنویسیم که شناسه های دانشجویی را با هم مقایسه می کند:
class StudentIdComparator implements Comparator<student>{

 public int compare(Student e1, Student e2) {
  return e1.id.compareTo(e2.id);
 }
}
بیایید یک لیست برای دانش آموزان و یک شی کلاس ایجاد کنیم که Comparator:
ArrayList<Student> myList = new ArrayList<> ();
StudentIdComparator comparator = new StudentIdComparator();
بیایید متد sortلیست خود را فراخوانی کنیم و مقایسه کننده را به آن منتقل کنیم:
myList.sort(comparator);
با این کار فهرست اصلی [4 دیوید، 2 تام، 5 روهیت، 1 پل، 3 ویشال] به [1 پل، 2 تام، 3 ویشال، 4 دیوید، 5 روهیت] تبدیل می شود. برای آخر من یک روش بسیار جالب اما کم استفاده را گذاشتم:
public List<E> subList(int fromIndex, int toIndex)
آن‌طور که به نظر می‌رسد، فهرست جدیدی را برمی‌گرداند، بلکه نمایی از فهرست (فهرست فرعی) که این متد برای آن فراخوانی شده است را برمی‌گرداند، به طوری که هر دو لیست عناصر ذخیره‌شده را به اشتراک می‌گذارند. subList یک لیست کاملاً کاربردی است؛ همچنین برای نوشتن کار می کند و تغییرات مناسب را در لیست اصلی ایجاد می کند. خواص عالی از این نتیجه می شود:
someList.subList(3, 7).clear();
در این مثال، someListچهار عنصر از لیست حذف خواهد شد، از سوم تا هفتم (غیر شامل). محدوده کار با لیست را نشان می دهیم و شروع می کنیم. در داخل متد، در اصل فراخوانی کلاس SubList وجود دارد که پیاده سازی های خاص خود را از متدهای شناخته شده دارد و در نتیجه عملکرد متد، یک شی از این کلاس برگردانده می شود. پیاده سازی خود کلاس را می توان در کد منبع مشاهده کرد . برای ادغام مطالب، پیشنهاد می کنم پیاده سازی خود را از یک آرایه پویا بنویسید. این در آینده بسیار مفید خواهد بود. به عنوان مثال، من پیاده سازی خود را از یک آرایه پویا فقط برای اعداد، با نظرات در کد ارائه می کنم.
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;
    }
}
فهرست منابع مورد استفاده:
  1. کد منبع ArrayList (جاری - JDK 12)؛
  2. بسیاری از تصاویر از اینجا و برخی از مقالات از JavaRush گرفته شده است.
  3. مقاله در Habré .
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION