JavaRush /Blog Jawa /Random-JV /Analisis rinci kelas ArrayList [Bagian 2]
Vonorim
tingkat

Analisis rinci kelas ArrayList [Bagian 2]

Diterbitake ing grup
Sayange, kabeh informasi ora cocog karo siji artikel, mula kita terus ndeleng metode sing isih ana ing kelas ArrayList. Koleksi urut:
public void sort(Comparator< ? super E> c)
Ngurutake dhaptar miturut aturan tartamtu. Aturan Urut minangka antarmuka Comparator sing diimplementasikake kanthi compare(). Overriding perlu yen koleksi ngemot obyek saka kelas dhewe. Nalika nggarap kelas standar (Integer, String, lan liya-liyane), override mbandhingake biasane mung dibutuhake kanggo ngurutake non-standar. Ayo nggawe kelas 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;
 }
}
Ayo nulis komparator prasaja sing bakal mbandhingake id siswa:
class StudentIdComparator implements Comparator<student>{

 public int compare(Student e1, Student e2) {
  return e1.id.compareTo(e2.id);
 }
}
Ayo nggawe dhaptar kanggo siswa lan obyek kelas sing ngetrapake Comparator:
ArrayList<Student> myList = new ArrayList<> ();
StudentIdComparator comparator = new StudentIdComparator();
Ayo nelpon metode sortkanggo dhaptar kita lan pass komparator kasebut:
myList.sort(comparator);
Iki bakal ngowahi dhaptar asli [4 David, 2 Tom, 5 Rohit, 1 Paul, 3 Vishal] dadi [1 Paul, 2 Tom, 3 Vishal, 4 David, 5 Rohit]. Kanggo pungkasan aku ninggalake cara sing menarik banget, nanging arang digunakake:
public List<E> subList(int fromIndex, int toIndex)
Ora ngasilake dhaptar anyar, kaya sing katon, nanging tampilan dhaptar (sublist) sing diarani metode iki, supaya dhaptar loro kasebut bakal nuduhake unsur sing disimpen. subList minangka dhaptar kanthi fungsi; uga bisa digunakake kanggo nulis, nggawe owah-owahan sing cocog kanggo dhaptar induk. Properti sing apik banget tindakake saka iki:
someList.subList(3, 7).clear();
Ing conto iki, someListpapat unsur bakal dibusak saka dhaftar, saka katelu kanggo kapitu (ora klebu). Kita nunjukake kisaran kanggo nggarap dhaptar lan mateni. Ing cara, ing intine, ana telpon menyang kelas SubList, sing duwe implementasine dhewe saka metode sing dikenal, lan minangka asil saka operasi metode kasebut, obyek saka kelas iki bali. Implementasine kelas kasebut dhewe bisa dideleng ing kode sumber . Kanggo nggabungake materi, aku saranake sampeyan nulis implementasine dhewe saka array dinamis. Iki bakal migunani banget ing mangsa ngarep. Minangka conto, aku nampilake implementasine array dinamis mung kanggo nomer, kanthi komentar ing kode kasebut.
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;
    }
}
Dhaptar sumber sing digunakake:
  1. Kode sumber ArrayList (saiki - JDK 12);
  2. Umume ilustrasi dijupuk saka kene lan sawetara artikel saka JavaRush;
  3. Artikel babagan Habré .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION