Как объявить ArrayList из Genric ArrayLists (2d Arraylists) в java?

#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. о, я такой тупой, что забыл об этом. я просто установил размер / емкость, но на самом деле еще ничего не добавил, я думал о массивах — поскольку, когда вы объявляете размер для массивов, вы можете получить к нему доступ, прежде чем добавлять к нему что-либо.