Created
June 9, 2016 18:08
-
-
Save YanchevskayaAnna/3be3f39da8d8709102b114b9211a4914 to your computer and use it in GitHub Desktop.
MyArrayList_MKlimov
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package src.kurs2.week2.day2HomeWork.myArrayList; | |
import java.util.Arrays; | |
import java.util.Objects; | |
/** | |
* Created by miha on 03.06.2016. | |
*/ | |
public class MyArrayList { | |
private Object[] elements; | |
private int size; //Yanchevskaya A. Если делать по аналогии с ArrayList, то size не используется. Используется свойство length массива | |
private static final int DEFAULT_SIZE = 10; | |
private int counter; | |
public MyArrayList() { //Yanchevskaya A. конструктор переставила наверх. Сначала идут свойства класса, потом конструкторы. | |
elements = new Object[this.DEFAULT_SIZE]; | |
size = DEFAULT_SIZE; | |
} | |
public Object[] getElements() { | |
return elements; | |
} | |
public void setElements(Object[] elements) { | |
this.elements = elements; | |
} | |
public int getSize() { | |
return size; | |
} | |
public void setSize(int size) { | |
this.size = size; | |
} | |
public static int getDefaultSize() { | |
return DEFAULT_SIZE; | |
} | |
public int getCounter() { | |
return counter; | |
} | |
public void setCounter(int counter) { | |
this.counter = counter; | |
} | |
/*********Добавление объекта в ArrayList******/ | |
public void show() { | |
for (int i = 0; i < counter; i++) { | |
System.out.println(elements[i]); | |
} | |
} | |
/*********Добавление объекта в ArrayList*****/ | |
public boolean add(Object obj) { | |
/* if (obj == null) return false; | |
else if (counter < size) { | |
elements[counter++] = obj; | |
} else { | |
int sizeNew = size * 2; | |
Object[] elementsNew = new Object[sizeNew]; | |
System.arraycopy(elements, 0, elementsNew, 0, size); | |
elements = elementsNew; | |
elements[counter++] = obj; | |
size = sizeNew; | |
} | |
*/ | |
/* Yanchevskaya A. | |
1. Если делать по аналогии с ArrayList, то он позволяет добавлять null. Поэтому проверку на null можно не писать | |
2. В любом случае выполняется действие elements[counter++] = obj; - значит его можно вынести из условия | |
3. Расширяем массив в двух случаях: и при добавлении объекта, и при добавлении по индексу, | |
поэтому делаю отдельный метод ensureCapacity() и буду его вызывать везде, где нужно расширить массив | |
*/ | |
ensureCapacity(); | |
elements[counter++] = obj; | |
return true; | |
} | |
public void ensureCapacity(){ | |
/*int sizeNew = size * 2; | |
Object[] elementsNew = new Object[sizeNew]; | |
System.arraycopy(elements, 0, elementsNew, 0, size); | |
elements = elementsNew;*/ | |
if (counter >= size) { | |
elements = Arrays.copyOf(elements, size * 2); // Yanchevskaya A. Если использовать данный метод - меньше кода | |
size = size * 2; | |
} | |
} | |
/*********Добавление объекта в ArrayList по индексу******/ | |
public boolean addIndex(int index, Object obj) { // Yanchevskaya A. Метод также должен называться add, т.е. метод add перегружен. | |
/* if (index <= counter && index >= 0) { | |
if (counter < size) { | |
System.arraycopy(elements, index, elements, index + 1, counter - index); | |
elements[index] = obj; | |
counter++; | |
return true; | |
} else { | |
int sizeNew = size * 2; | |
Object[] elementsNew = new Object[sizeNew]; | |
System.arraycopy(elements, 0, elementsNew, 0, counter); | |
System.arraycopy(elementsNew, index, elementsNew, index + 1, counter - index); | |
elementsNew[index] = obj; | |
elements = elementsNew; | |
counter++; | |
size = sizeNew; | |
} | |
return true; | |
} else | |
return false;*/ | |
// Yanchevskaya A. | |
//1. Изменила проверку. Индекс может быть равен counter | |
//2. После расширения массива, код одинаковый | |
if (index > counter || index < 0) { | |
return false; | |
} | |
ensureCapacity(); | |
System.arraycopy(elements, index, elements, index + 1, counter - index); | |
elements[index] = obj; | |
counter++; | |
return true; | |
} | |
/*********Удаление объекта в ArrayList*******/ | |
public boolean remove(Object obj) { | |
/*Yanchevskaya A. нужно также обрабатывать ситуацию, если obj = null | |
В методе add у тебя нельзя добавить null, поэтому удаление сейчас также правильно сделано | |
Если посмотреть стандартный ArrayList, то добавлять null можно и при удалении также нужно учитывать null | |
Женя на лекции рассказывал подробно про удаление и про момент с null*/ | |
for (int i = 0; i < counter; i++) { | |
if (elements[i].equals(obj)) { | |
System.arraycopy(elements, i + 1, elements, i, counter - i - 1); | |
elements[--counter] = null; | |
return true; | |
} | |
} | |
return false; | |
} | |
/*********Удаление объекта в ArrayList по индексу******/ | |
public boolean removeIndex(int index) { // Yanchevskaya A. Метод также должен называться remove, т.е. метод remove перегружен. | |
//Yanchevskaya A. В ArrayList это метод: public E remove(int index) Т.е. он возвращает значение, которое удалил | |
if (index < counter && index >= 0) { | |
int numForCopy = counter - index - 1; //какое количество элементов надо скопировать | |
System.arraycopy(elements, index + 1, elements, index, numForCopy); | |
elements[--counter] = null; //уменьшаем размер массива и забываем про последний элемент | |
return true; | |
} else return false; | |
} | |
/*************Метод получения объекта по индексу******************/ | |
public Object get(int index) { | |
if (index >= 0 && index < counter) { | |
return elements[index]; | |
} | |
return null; | |
} | |
/*********Метод Set.Заменяем объект новым объектом в позиции*******/ | |
public boolean setIndex(int index, Object obj) { //Yanchevskaya A. В ArrayList этот метод такой: public E set(int index, E element) То есть он возвращает предыдущее значение по указанному индексу | |
if (index < counter && index >= 0) { | |
elements[index] = obj; | |
return true; | |
} | |
return false; | |
} | |
/*********Метод size.Показываем сколько непустых елементов*******/ | |
public int size() { | |
return counter; | |
} | |
/*********Метод Clear.Очищаем массив(заполняем null*******/ | |
public boolean clear() { | |
for (int i = 0; i < size; i++) { //Yanchevskaya A. Достаточно пройтись до counter | |
elements[i] = null; | |
} | |
return true; | |
} | |
/*********Метод Contains.Проверяет есть ли объект в листе*******/ | |
public boolean contains(Object obj) { | |
for (int i = 0; i < counter; i++) { | |
if (obj.equals(elements[i])) //Yanchevskaya A. А если obj = null, у null нет метода equals и будет ошибка | |
return true; | |
} | |
return false; | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment