JavaRush /Java Blogu /Random-AZ /ArrayList sinfinin ətraflı təhlili [2-ci hissə]
Vonorim
Səviyyə

ArrayList sinfinin ətraflı təhlili [2-ci hissə]

Qrupda dərc edilmişdir
Təəssüf ki, bütün məlumatlar bir məqaləyə sığmadı, ona görə də ArrayList sinfinin qalan üsullarına baxmağa davam edirik. Kolleksiyanı çeşidləyin:
public void sort(Comparator< ? super E> c)
Siyahını verilmiş qaydaya görə çeşidləyir. Çeşidləmə qaydası ləğv edilmiş bir müqayisəlicompare() interfeysdir . Kolleksiyada öz sinfinin obyektləri varsa, ləğv etmək lazımdır. Standart siniflərlə işləyərkən (Integer, String və s.) müqayisənin ləğvi adətən yalnız qeyri-standart çeşidləmə üçün lazımdır. Bir sinif yaradaq 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;
 }
}
Tələbə identifikatorlarını müqayisə edəcək sadə müqayisəçi yazaq:
class StudentIdComparator implements Comparator<student>{

 public int compare(Student e1, Student e2) {
  return e1.id.compareTo(e2.id);
 }
}
Gəlin tələbələr üçün siyahı və həyata keçirən sinif obyekti yaradaq Comparator:
ArrayList<Student> myList = new ArrayList<> ();
StudentIdComparator comparator = new StudentIdComparator();
sortSiyahımız üçün metodu çağıraq və müqayisəçini ona ötürək:
myList.sort(comparator);
Bu, orijinal siyahını [4 David, 2 Tom, 5 Rohit, 1 Paul, 3 Vishal] [1 Paul, 2 Tom, 3 Vishal, 4 David, 5 Rohit]-ə çevirəcək. Sonda çox maraqlı, lakin nadir hallarda istifadə olunan bir üsul buraxdım:
public List<E> subList(int fromIndex, int toIndex)
O, göründüyü kimi yeni siyahı deyil, bu metodun çağırıldığı siyahının (alt siyahının) görünüşünü qaytarır ki, hər iki siyahı saxlanılan elementləri paylaşsın. subList tam funksional siyahıdır; o, həm də əsas siyahıya müvafiq dəyişikliklər edərək yazı üçün işləyir. Əla xüsusiyyətlər bundan irəli gəlir:
someList.subList(3, 7).clear();
Bu misalda someListdörd element siyahıdan çıxarılacaq, üçüncüdən yeddinciyə (daxil deyil). Siyahı ilə işləmək üçün diapazonu göstəririk və yola düşürük. Metodun daxilində mahiyyət etibarı ilə məlum metodların özünəməxsus həyata keçirilməsinə malik olan SubList sinfinə çağırış var və metodun işləməsi nəticəsində bu sinfin obyekti qaytarılır. Sinfin həyata keçirilməsinə mənbə kodunda baxmaq olar . Materialı birləşdirmək üçün sizə dinamik massivin öz tətbiqinizi yazmağı təklif edirəm. Bu, gələcəkdə çox faydalı olacaq. Nümunə olaraq, koddakı şərhlərlə yalnız rəqəmlər üçün dinamik massiv tətbiqini təqdim edirəm.
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;
    }
}
İstifadə olunan mənbələrin siyahısı:
  1. ArrayList mənbə kodu (cari - JDK 12);
  2. İllüstrasiyaların əksəriyyəti buradan , bəzi məqalələr isə JavaRush-dan götürülüb;
  3. Habré haqqında məqalə .
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION