JavaRush /Java блогы /Random-KK /ArrayList класының егжей-тегжейлі талдауы [2-бөлім]
Vonorim
Деңгей

ArrayList класының егжей-тегжейлі талдауы [2-бөлім]

Топта жарияланған
Өкінішке орай, барлық ақпарат бір мақалаға сәйкес келмеді, сондықтан біз ArrayList класының қалған әдістерін қарастыруды жалғастырамыз. Жинақты сұрыптау:
public void sort(Comparator< ? super E> c)
Берілген ережеге сәйкес тізімді сұрыптайды. Сұрыптау ережесі - қайта анықталғаны бар орындалған Comparatorcompare() интерфейсі . Егер жинақта өз класының нысандары болса, қайта анықтау қажет. Стандартты сыныптармен жұмыс істегенде (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);
 }
}
Оқушылар үшін тізімді және орындайтын сынып нысанын жасайық 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 класына шақыру бар және әдіс жұмысының нәтижесінде осы класстың 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 бастапқы codeы (ағымдағы – JDK 12);
  2. Суреттердің көпшілігі осы жерден және кейбір мақалалар JavaRush-тен алынды ;
  3. Хабре туралы мақала .
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION