لسوء الحظ، لم تتناسب جميع المعلومات في مقال واحد، لذلك نواصل النظر في الطرق المتبقية لفئة 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)
لا تقوم بإرجاع قائمة جديدة، كما قد يبدو، ولكن عرضًا للقائمة (القائمة الفرعية) التي تم استدعاء هذه الطريقة لها، بحيث تتشارك كلتا القائمتين في العناصر المخزنة. القائمة الفرعية هي قائمة كاملة الوظائف، كما أنها تعمل أيضًا على الكتابة وإجراء التغييرات المناسبة على القائمة الرئيسية. خصائص ممتازة تتبع من هذا:
someList.subList(3, 7).clear();
في هذا المثال، someList
ستتم إزالة أربعة عناصر من القائمة، من الثالث إلى السابع (غير شامل). نشير إلى النطاق للعمل مع القائمة وننطلق. داخل الطريقة، يوجد في الأساس استدعاء لفئة القائمة الفرعية، التي لها تطبيقاتها الخاصة للطرق المعروفة، ونتيجة لتشغيل الطريقة، يتم إرجاع كائن من هذه الفئة. يمكن الاطلاع على تنفيذ الفصل نفسه في الكود المصدري . لدمج المادة، أقترح عليك أن تكتب تطبيقك الخاص للمصفوفة الديناميكية. سيكون هذا مفيدًا جدًا في المستقبل. على سبيل المثال، أقدم تنفيذي لمصفوفة ديناميكية للأرقام فقط، مع التعليقات في الكود.
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;
}
}
قائمة المصادر المستخدمة:
GO TO FULL VERSION