JavaRush /مدونة جافا /Random-AR /تحليل مفصل لفئة ArrayList [الجزء الثاني]
Vonorim
مستوى

تحليل مفصل لفئة ArrayList [الجزء الثاني]

نشرت في المجموعة
لسوء الحظ، لم تتناسب جميع المعلومات في مقال واحد، لذلك نواصل النظر في الطرق المتبقية لفئة ArrayList. فرز المجموعة:
public void sort(Comparator< ? super E> c)
فرز القائمة وفقا لقاعدة معينة. قاعدة الفرز هي واجهة مقارنة تم تنفيذها مع تجاوز compare(). يعد التجاوز ضروريًا إذا كانت المجموعة تحتوي على كائنات من فئتها الخاصة. عند العمل مع الفئات القياسية (عدد صحيح، سلسلة، وما إلى ذلك)، عادةً ما يكون تجاوز المقارنة مطلوبًا فقط للفرز غير القياسي. لنقم بإنشاء فصل دراسي 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)
لا تقوم بإرجاع قائمة جديدة، كما قد يبدو، ولكن عرضًا للقائمة (القائمة الفرعية) التي تم استدعاء هذه الطريقة لها، بحيث تتشارك كلتا القائمتين في العناصر المخزنة. القائمة الفرعية هي قائمة كاملة الوظائف، كما أنها تعمل أيضًا على الكتابة وإجراء التغييرات المناسبة على القائمة الرئيسية. خصائص ممتازة تتبع من هذا:
someList.subList(3, 7).clear();
في هذا المثال، someListستتم إزالة أربعة عناصر من القائمة، من الثالث إلى السابع (غير شامل). نشير إلى النطاق للعمل مع القائمة وننطلق. داخل الطريقة، يوجد في الأساس استدعاء لفئة القائمة الفرعية، التي لها تطبيقاتها الخاصة للطرق المعروفة، ونتيجة لتشغيل الطريقة، يتم إرجاع كائن من هذه الفئة. يمكن الاطلاع على تنفيذ الفصل نفسه في الكود المصدري . لدمج المادة، أقترح عليك أن تكتب تطبيقك الخاص للمصفوفة الديناميكية. سيكون هذا مفيدًا جدًا في المستقبل. على سبيل المثال، أقدم تنفيذي لمصفوفة ديناميكية للأرقام فقط، مع التعليقات في الكود.
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. مقال عن حبري .
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION