JavaRush /Blogue Java /Random-PT /Análise detalhada da classe ArrayList [Parte 2]
Vonorim
Nível 26

Análise detalhada da classe ArrayList [Parte 2]

Publicado no grupo Random-PT
Infelizmente, todas as informações não cabem em um artigo, então continuamos examinando os métodos restantes da classe ArrayList. Classificar coleção:
public void sort(Comparator< ? super E> c)
Classifica a lista de acordo com uma determinada regra. Uma regra de classificação é uma interface Comparator implementada com um arquivo compare(). A substituição será necessária se a coleção contiver objetos de sua própria classe. Ao trabalhar com classes padrão (Inteiro, String e assim por diante), a substituição de comparação geralmente só é necessária para classificação não padrão. Vamos criar uma classe 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;
 }
}
Vamos escrever um comparador simples que irá comparar os IDs dos alunos:
class StudentIdComparator implements Comparator<student>{

 public int compare(Student e1, Student e2) {
  return e1.id.compareTo(e2.id);
 }
}
Vamos criar uma lista para alunos e um objeto de classe que implemente Comparator:
ArrayList<Student> myList = new ArrayList<> ();
StudentIdComparator comparator = new StudentIdComparator();
Vamos chamar o método sortda nossa lista e passar o comparador para ele:
myList.sort(comparator);
Isso transformará a lista original [4 David, 2 Tom, 5 Rohit, 1 Paul, 3 Vishal] em [1 Paul, 2 Tom, 3 Vishal, 4 David, 5 Rohit]. Por último deixei um método muito interessante, mas raramente usado:
public List<E> subList(int fromIndex, int toIndex)
Não retorna uma nova lista, como pode parecer, mas sim uma visualização da lista (sublista) para a qual este método foi chamado, de forma que ambas as listas compartilharão os elementos armazenados. subList é uma lista totalmente funcional; ela também funciona para escrita, fazendo alterações apropriadas na lista pai. Excelentes propriedades decorrem disso:
someList.subList(3, 7).clear();
Neste exemplo, someListquatro elementos serão retirados da lista, do terceiro ao sétimo (não inclusivo). Indicamos o intervalo para trabalhar com a lista e pronto. Dentro do método, em essência, há uma chamada para a classe SubList, que possui suas próprias implementações de métodos conhecidos, e como resultado da operação do método, um objeto desta classe é retornado. A implementação da classe em si pode ser visualizada no código- fonte . Para consolidar o material, sugiro que você escreva sua própria implementação de array dinâmico. Isto será muito útil no futuro. Como exemplo, apresento minha implementação de um array dinâmico apenas para números, com comentários no código.
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;
    }
}
Lista de fontes utilizadas:
  1. Código fonte ArrayList (atual - JDK 12);
  2. A maioria das ilustrações foi tirada daqui e de alguns artigos do JavaRush;
  3. Artigo sobre Habré .
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION