JavaRush /Java блогу /Random-KY /ArrayList классынын деталдуу анализи [2-бөлүк]
Vonorim
Деңгээл

ArrayList классынын деталдуу анализи [2-бөлүк]

Группада жарыяланган
Тилекке каршы, бардык маалыматтар бир макалага туура келген жок, ошондуктан биз ArrayList классынын калган ыкмаларын карап чыгууну улантабыз. Коллекцияны сорттоо:
public void sort(Comparator< ? super E> c)
Берилген эрежеге ылайык тизмени иреттейт. Сорттоо эрежеси - бул жокко чыгарылган компаратор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)
Ал көрүнгөндөй жаңы тизмени кайтарbyte, бирок эки тизме тең сакталган элементтерди бөлүшө тургандай, бул ыкма чакырылган тизменин (подлисист) көрүнүшү. 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. Habré жөнүндө макала .
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION