Тилекке каршы, бардык маалыматтар бир макалага туура келген жок, ошондуктан биз 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;
}
}
Колдонулган булактардын тизмеси:
- ArrayList баштапкы codeу (учурдагы - JDK 12);
- Иллюстрациялардын көбү бул жерден жана кээ бир макалалар JavaRushтан алынган;
- Habré жөнүндө макала .
GO TO FULL VERSION