У меня возникли проблемы с классом arrayList
который представляет список объектов и поддерживает произвольный доступ к его объектам с помощью индекса числовой позиции.
После разработки проблем с toString()
и size()
меня возникла проблема, когда я не инициализирую мой массив-член; только инициализация переменной локали. Однако у меня сложилось впечатление, что сделанная мной модификация должна решить проблему.
public Object get(int a) {
if (a < 0 || a >= logicalSize) {
throw new IndexOutOfBoundsException("Positions must be from position 0 to position "+
(logicalSize - 1));
}
else {
return array[a];
}
}
Но не должно мое объявление private static Object[] array = new Object[5];
решить это?
В настоящее время я получаю ошибку, бросая мое исключение, сообщая мне, что моя позиция должна быть от 0 до -1, предполагая, что она не создана.
Полный код:
public class Tester {
public static void main(String [] args)
{
arrayList a1, a2;
a1 = new arrayList();
a2 = new arrayList(5);
a2.size();
System.out.println(a1.toString());
//System.out.println(a2.toString());
}
}
public class arrayList
{
private int logicalSize;
private static Object[] array = new Object[0];
private Object[] original;
private Object removedElement;
public arrayList()
{
Object[] array = new Object[]{null,null,null,null,null};
}
public arrayList(int i)
{
logicalSize = i;
Object[] array = new Object[logicalSize - 1];
}
public arrayList(Object[] array)
{
logicalSize = array.length;
Object[] copyArray = array;
}
public String toString(Object[] array)
{
String str = " ";
for(int a = 0; a < logicalSize; a++)
{
str = str + array[a];
}
str = str + "\nSize: " + size();
return str;
}
public int size()
{
int length = array.length;
return length;
}
}
Большое спасибо, Packerfan504
Во-первых, вы должны следовать соглашениям Java для имен классов. Он должен начинаться с прописной буквы и идти CamelCase.
array
безусловно, не должен быть static
. Когда вы объявляете элемент static
, это означает, что он разделяется между всеми экземплярами
В конструкторах вы устанавливаете локальные переменные вместо члена.
// remove Object[] in front
array = new Object[]{null,null,null,null,null};
Конструктор из массива не устанавливает array
элементов.
public arrayList(Object[] array)
{
logicalSize = array.length;
//Object[] copyArray = array;
this.array = array;
}
Это не делает никакой копии: элемент ссылается на массив, переданный как параметр. Мне нужен какой-то "конструктор копирования", вам нужно создать экземпляр нового массива и скопировать каждый элемент. Или используйте Arrays.copyOf()
.
Вы должны переопределить метод toString()
из java.langObject
с правой подписью (зачем передавать массив как парметер?). Все классы в Java неявно расширяют класс Object
.
Вы должны различать размер массива Object[]
- это число потенитальных слотов, которые у вас есть до того, как потребуется увеличение массива, и логический размер, который отражает количество элементов, которые вы положили в свой массив. Здесь вы устанавливаете логический размер array.length, то есть просто избыточную информацию.
EDIT Дополнительные советы
В конструкторе с параметром size в качестве параметра вы создаете массив (logicalSize-1). Зачем?
В конструкторе по умолчанию вы не инициализируете logicalSize
, а затем устанавливаете значение 0
. Это нормально для меня, но тогда, почему вы устанавливаете его в i
в конструкторе с параметром размера? Тогда это нормально, что в a1.get(0)
:
if (a < 0 || a >= logicalSize) {...}
является true
и генерирует исключение.
Я бы рекомендовал вам разъяснить роль logicalSize
которая (для меня) - количество фактических объектов в ArrayList
. Обратите внимание, что в вашем тесте вы еще ничего не помещаете в свой массив. Даже если у вас есть внутренний массив, который может содержать 5 объектов, пока вы не add(...)
что-то, вызов get(0)
должен вызвать исключение.
У вас есть статическая переменная класса
private static Object[] array
и в вашем конструкторе вы создаете локальный массив переменных;
т.е. делать это
Object[] array
снова собирается создать локальную переменную для этой функции.
так как вы снова объявили Object [], что это будет переменная в пределах области конструктора.
private int logicalSize; private Object[] array = new Object[5]; private Object[] original; private Object removedElement; public ArrayList() { array = new Object[5]; }
array
статичен?