#java #generics #arraylist #multidimensional-array #declaration
#java #дженерики #arraylist #многомерный массив #объявление
Вопрос:
Итак, я пытался создать ArrayList из ArrayList дженериков. В основном у меня есть универсальный класс с именем Color (который принимает целочисленные / длинные / короткие значения во время выполнения). И теперь я хотел создать 2d ArrayList типа «Color», скажем, в классе с именем Picture. У меня есть конструктор и объявление ArrayList. Но чего я не понимаю, так это почему размер ArrayList в конечном итоге равен 0, хотя я объявляю размер больше 0. Подробнее об этом после кода…
import java.util.ArrayList;
public class Picture{
private ArrayList<ArrayList<Color<?>>> pic;
//constructor that takes in height and width of 2d array, and a Color parameter that will be populated in the 2d list
public Picture(int height, int width, Color color){
if((height <= 0) || (width<=0)){
throw new IndexOutOfBoundsException("invalid height and/or width");
}
else{
pic = new ArrayList<ArrayList<Color<?>>>(height);
System.out.println("size of given array: " pic.size()); //for error handling purposes
for(int r =0; r< pic.size(); r ){
pic.set(r, new ArrayList<Color<?>>(width));
for(int c = 0; c< width; c ){
pic.get(r).set(c, color);
}
}
}
}
}
Каждый раз, когда я запускаю код, чтобы протестировать его, создавая новый объект Picture, подобный Picture pic1 =new Picture(3,4, new Color<Integer>(2));
или, если на то пошло, любые значения, превышающие 0, в качестве высоты и ширины; Я всегда получаю «размер заданного массива: 0» (из System.out.println()
инструкции), и цикл for даже не выполняется, посколькуразмер списка в конечном итоге равен 0. Наконец, вся совокупность цветового объекта, которая должна иметь место в 2d ArrayList, вообще не выполняется, и ‘2d ArrayList — pic’ в конечном итоге ничего не содержит.
Я не понимаю, где я ошибаюсь и где 2d ArrayList присваивается размер 0, даже когда я присваиваю ему значение ‘height’, которое гарантированно больше нуля (причина оператора if). Я предполагаю, что я объявил / инициализировал 2d Arraylist — pic
неправильно. Может кто-нибудь, пожалуйста, помочь мне? Также не стесняйтесь указывать на любые другие ошибки в моем коде.
Спасибо
Комментарии:
1.
ArrayList<ArrayList<? extends Color>> pic;
?2. Итак, я пытаюсь создать 2d arraylist цвета, который является универсальным классом. Вы хотите сказать, что это верхний предел и что я пытаюсь создать 2d arraylist подклассов Color. Я мог бы сделать класс Picture универсальным и сделать что-то подобное
ArrayList<ArrayList<Color<E>>> pic;
, но это вызвало бы другие проблемы для других моих классов. Есть ли какой-либо другой способ сделать это, кромеColor<?>
?
Ответ №1:
Вы неправильно понимаете ArrayList / этот конструктор.
ArrayLists имеют два свойства, которые зависят от размера:
Емкость
Это число почти никогда не бывает интересным и означает очень мало. Это деталь реализации: массив емкостью 10 позволит вам добавлять к нему до 10 элементов без изменения размера внутреннего массива (что такое изменение размера внутреннего массива? .. внутренняя деталь реализации. Я сказал вам, что это в принципе не имеет значения). Если вы попытаетесь добавить 11-й, это будет работать просто отлично, и, как часть этого, емкость автоматически немного увеличивается (возможно, до 15, если память не изменяет). Внутри ArrayList имеет массив с данными (отсюда и название), и если вы попытаетесь добавить элемент в arraylist, который находится в емкости, внутренне создается новый, больший массив, старый массив копируется в новый, затем новый массив занимает место массивахранилище данных и старое хранилище отбрасываются. Вот что такое емкость.
Существует очень мало способов даже заметить, и вам редко нужно заботиться.
Размер
Это относится к фактическому количеству записей в списке. Это необходимо capacity
или меньше.
new ArrayList<Whatever>(10)
создает arraylist емкостью 10 и размером 0. Вы не можете (легко) создать arraylist с X нулевыми указателями в нем, и вы, как правило, тоже не хотите этого делать. Например, в этом тривиальном случае все, что вам нужно сделать, это [A] заменить r<pic.size()
аргумент на r<height
, и [B] заменить .set
на .add
.
Комментарии:
1. о, я такой тупой, что забыл об этом. я просто установил размер / емкость, но на самом деле еще ничего не добавил, я думал о массивах — поскольку, когда вы объявляете размер для массивов, вы можете получить к нему доступ, прежде чем добавлять к нему что-либо.