JavaRush /Java blogi /Random-UZ /ArrayList sinfining batafsil tahlili [2-qism]
Vonorim
Daraja

ArrayList sinfining batafsil tahlili [2-qism]

Guruhda nashr etilgan
Afsuski, barcha ma'lumotlar bitta maqolaga to'g'ri kelmadi, shuning uchun biz ArrayList sinfining qolgan usullarini ko'rib chiqishda davom etamiz. To'plamni saralash:
public void sort(Comparator< ? super E> c)
Roʻyxatni berilgan qoida boʻyicha tartiblaydi. Saralash qoidasi bekor qilingan bilan amalga oshirilgan Comparatorcompare() interfeysidir . Agar to'plamda o'z sinfiga tegishli ob'ektlar bo'lsa, bekor qilish kerak. Standart sinflar (Integer, String va boshqalar) bilan ishlashda solishtirishni bekor qilish odatda faqat nostandart tartiblash uchun kerak bo'ladi. Keling, sinf yarataylik 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;
 }
}
Talaba identifikatorlarini solishtiradigan oddiy taqqoslagichni yozamiz:
class StudentIdComparator implements Comparator<student>{

 public int compare(Student e1, Student e2) {
  return e1.id.compareTo(e2.id);
 }
}
Keling, talabalar uchun ro'yxat va sinf ob'ektini yarataylik Comparator:
ArrayList<Student> myList = new ArrayList<> ();
StudentIdComparator comparator = new StudentIdComparator();
sortKeling, ro'yxatimizning usulini chaqiramiz va unga taqqoslashni o'tkazamiz:
myList.sort(comparator);
Bu asl ro'yxatni [4 David, 2 Tom, 5 Rohit, 1 Paul, 3 Vishal] [1 Paul, 2 Tom, 3 Vishal, 4 David, 5 Rohit] ga aylantiradi. Va nihoyat, men juda qiziqarli, ammo kamdan-kam ishlatiladigan usulni qoldirdim:
public List<E> subList(int fromIndex, int toIndex)
U ko'rinishi mumkin bo'lgan yangi ro'yxatni emas, balki ushbu usul chaqirilgan ro'yxatning (sublist) ko'rinishini qaytaradi, shunda ikkala ro'yxat ham saqlangan elementlarni baham ko'radi. subList to'liq ishlaydigan ro'yxat bo'lib, u asosiy ro'yxatga tegishli o'zgartirishlar kiritib yozish uchun ham ishlaydi. Bundan ajoyib xususiyatlar kelib chiqadi:
someList.subList(3, 7).clear();
Ushbu misolda someListto'rtta element uchinchidan ettinchigacha (shu jumladan emas) ro'yxatdan o'chiriladi. Biz ro'yxat bilan ishlash oralig'ini ko'rsatamiz va biz ketamiz. Usul ichida, mohiyatiga ko'ra, SubList sinfiga qo'ng'iroq mavjud bo'lib, u ma'lum usullarning o'ziga xos amalga oshirilishiga ega va metodning ishlashi natijasida ushbu sinf ob'ekti qaytariladi. Sinfning o'zi amalga oshirilishini manba kodida ko'rish mumkin . Materialni birlashtirish uchun men sizga dinamik massivning o'z amaliyotini yozishni taklif qilaman. Bu kelajakda juda foydali bo'ladi. Misol tariqasida, men koddagi izohlar bilan faqat raqamlar uchun dinamik massivni amalga oshirishimni taqdim etaman.
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;
    }
}
Foydalanilgan manbalar ro'yxati:
  1. ArrayList manba kodi (hozirgi - JDK 12);
  2. Rasmlarning aksariyati shu yerdan va ba'zi maqolalar JavaRush'dan olingan;
  3. Habré haqidagi maqola .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION