JavaRush /Блоги Java /Random-TG /Таҳлили муфассали синфи ArrayList [Қисми 2]
Vonorim
Сатҳи

Таҳлили муфассали синфи ArrayList [Қисми 2]

Дар гурӯҳ нашр шудааст
Мутаассифона, ҳама маълумот ба як мақола мувофиқат намекарданд, аз ин рӯ мо баррасии усулҳои боқимондаи синфи ArrayList-ро идома медиҳем. Маҷмӯаи гурӯҳбандӣ:
public void sort(Comparator< ? super E> c)
Рӯйхатро мувофиқи қоидаҳои додашуда мураттаб мекунад. Қоидаи навъбандӣ интерфейси иҷрошудаи Comparator бо бекоршуда мебошад compare(). Агар коллексия an objectҳои синфи худро дошта бошад, бекоркунӣ зарур аст. Ҳангоми кор бо синфҳои стандартӣ (Integer, String, ва ғайра), ивазкунии муқоиса одатан танҳо барои навъбандии ғайристандартӣ лозим аст. Биёед синф эҷод кунем 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);
 }
}
Биёед барои донишҷӯён рӯйхат ва an objectи синферо созем, ки амалӣ мекунад 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чор элемент аз рӯйхат хориҷ карда мешавад, аз сеюм то ҳафтум (на фарогир). Мо диапазони кор бо рӯйхатро нишон медиҳем ва мо меравем. Дар дохor усул, аслан занг ба синфи SubList мавҷуд аст, ки амалисозии методҳои маълуми худро дорад ва дар натиҷаи амали метод an objectи ин синф баргардонида мешавад. Татбиқи худи синфро дар codeи сарчашма дидан мумкин аст . Барои муттаҳид кардани мавод, ман ба шумо пешниҳод мекунам, ки татбиқи массиви динамикии худро нависед. Ин дар оянда хеле муфид хоҳад буд. Ҳамчун мисол, ман татбиқи массиви динамикии худро танҳо барои рақамҳо бо шарҳҳо дар code пешниҳод мекунам.
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