안타깝게도 모든 정보가 하나의 기사에 포함되지 않았으므로 ArrayList 클래스의 나머지 메서드를 계속해서 살펴보겠습니다. 컬렉션 정렬:
public void sort(Comparator< ? super E> c)
주어진 규칙에 따라 목록을 정렬합니다. 정렬 규칙은 재정의된 Comparatorcompare()
인터페이스로 구현됩니다 . 컬렉션에 자체 클래스의 개체가 포함된 경우 재정의가 필요합니다. 표준 클래스(정수, 문자열 등)로 작업할 때 비교 재정의는 일반적으로 비표준 정렬에만 필요합니다. 클래스를 만들어 봅시다 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;
}
}
학생 ID를 비교하는 간단한 비교기를 작성해 보겠습니다.
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 David, 2 Tom, 5 Rohit, 1 Paul, 3 Vishal]이 [1 Paul, 2 Tom, 3 Vishal, 4 David, 5 Rohit]으로 변경됩니다. 마지막으로 나는 매우 흥미롭지만 거의 사용되지 않는 방법을 남겼습니다.
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;
}
}
사용된 소스 목록:
GO TO FULL VERSION