JavaRush /จาวาบล็อก /Random-TH /การวิเคราะห์โดยละเอียดของคลาส ArrayList [ตอนที่ 2]
Vonorim
ระดับ

การวิเคราะห์โดยละเอียดของคลาส ArrayList [ตอนที่ 2]

เผยแพร่ในกลุ่ม
น่าเสียดายที่ข้อมูลทั้งหมดไม่พอดีกับบทความเดียว ดังนั้นเราจึงดูวิธีการที่เหลือของคลาส ArrayList ต่อไป จัดเรียงคอลเลกชัน:
public void sort(Comparator< ? super E> c)
เรียงลำดับรายการตามกฎที่กำหนด กฎการเรียงลำดับคือ อินเท อร์เฟซตัวเปรียบเทียบ ที่นำไปใช้ โดยมีการcompare()แทนที่ การเอาชนะเป็นสิ่งที่จำเป็นหากคอลเลกชันมีอ็อบเจ็กต์ของคลาสของตัวเอง เมื่อทำงานกับคลาสมาตรฐาน (จำนวนเต็ม สตริง และอื่นๆ) โดยทั่วไปการแทนที่การเปรียบเทียบจำเป็นสำหรับการเรียงลำดับที่ไม่เป็นมาตรฐานเท่านั้น มาสร้างคลาสกันเถอะ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 ซึ่งมีการใช้งานเมธอดที่รู้จักของตัวเอง และผลจากการดำเนินการของเมธอด ทำให้อ็อบเจ็กต์ของคลาสนี้ถูกส่งคืน การใช้งานคลาสนั้นสามารถดูได้ในซอร์สโค้ด เพื่อรวมเนื้อหาเข้าด้วยกัน ฉันขอแนะนำให้คุณเขียนการใช้งานอาร์เรย์แบบไดนามิกของคุณเอง สิ่งนี้จะมีประโยชน์มากในอนาคต ตามตัวอย่าง ฉันนำเสนอการใช้งานอาร์เรย์แบบไดนามิกสำหรับตัวเลขเท่านั้น พร้อมความคิดเห็นในโค้ด
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