Создать Массив Arraylists


175

Я хочу создать массив arraylist, как показано ниже:

ArrayList<Individual>[] group = new ArrayList<Individual>()[4]

Но это не компиляция. Как я могу это сделать?


8
Не смешивайте массивы и коллекции. На самом деле, не используйте массивы, если вы не имеете дело с примитивами (или не знаете, что делаете). Массивы - это кошмар юзабилити, они делают ваш код неуправляемым.
Шон Патрик Флойд

13
@SeanPatrickFloyd Можете ли вы объяснить, почему массивы - это кошмар юзабилити?
пользователь

3
@crucifiedsoul уверен. массив не может расти, вы ничего не можете вставить в массив, массив не переопределяет стандартные методы, такие как equals hashcode, toString и т. д.
Шон Патрик Флойд

9
@SeanPatrickFloyd хорошо - ну, мне нужно ровно четыре массива - я планирую получить доступ к каждому по индексу - мне не нужен внешний массив для роста или сжатия - мне не нужны ни toString, ни хэш-код и т. Д. - - для меня массив здесь очевидный выбор - что бы вы порекомендовали в качестве альтернативы в этой ситуации?
BrainSlugs83

4
Хорошо, это старый вопрос, но я все равно задам вопрос и посмотрю, кто ответит. Я вижу, как все говорят о том, почему массив списков является ужасной идеей, плохой практикой кодирования и т. Д. Я искал это, потому что я учусь создавать цепочки хешей, а определение цепочки хешей - это массив списков! Так как именно центральная структура данных программирования может быть ужасной практикой кодирования? Или это просто попадает в категорию IYKWYD, упомянутую @Sean?
jimboweb

Ответы:


142

Согласно документации Oracle :

«Вы не можете создавать массивы параметризованных типов»

Вместо этого вы можете сделать:

ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);

Как предположил Том Хоутинг - tackline, это еще лучше сделать:

List<List<Individual>> group = new ArrayList<List<Individual>>(4);

20
List<List<Individual>> group = new ArrayList<List<Individual>>();вероятно, будет лучше.
Том Хотин -

4
Что значит «не может создать массив универсального типа»? Это на самом деле не имеет смысла для меня, потому что это не универсально, если вы предоставляете то, что он должен держать, верно?
Энди

5
Я удивлен голосами против, поскольку они не отвечают на вопрос (т.е. я хочу сделать это, как я могу это сделать). За исключением, может быть, для 1-го предложения.
Флориан Ф

15
почему список ссылок лучше, чем ArrayList?
шифу

3
@shifu Список ссылок является более общим, чем ArrayList; объявление как List абстрагирует API ArrayList, который выходит за пределы List API. Это хорошо, потому что он упрощает ссылку на List, чей API, вероятно, имеет в полном объеме то, что List необходим в любом случае, не загромождая API этой ссылки дополнительными функциями ArrayList. Вы должны объявлять ArrayList только в том случае, если вам нужно что-то конкретное из его API, которое будет доступно через ссылку.
виолончель

98

Как уже упоминали другие, вероятно, лучше использовать другой список для хранения ArrayList, но если вам нужно использовать массив:

ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

4
Кажется, никто не может объяснить, почему, и мне нравится ваш фрагмент выше. почему вы рекомендуете использовать список над этим?
clankill3r

3
Если группа массивов не изменяется, тогда этот подход лучше, поскольку массивы работают быстрее, чем классы List <>.
Борж

33
Спасибо за ответ на вопрос. Нет логической причины автоматически предполагать, что список предпочтительнее массива без дополнительного контекста.
Специальный соус

3
По какой-либо причине это будет предпочтительнее, чем @kelvincer Answer ( ArrayList<String>[] group = new ArrayList[4])? Что еще хорошего делает актерский состав?
виолончель

2
Вы должны использовать, new ArrayList<?>[N]чтобы избежать использования необработанного типа.
Radiodef

80

Это работает:

ArrayList<String>[] group = new ArrayList[4];

1
Это удовлетворительно имеет желаемое преимущество, так как добавление ArrayList любого объекта, кроме String (т.е. ArrayList<String>вместо ArrayList<NotString>) group, не компилируется
cellepo

12
Это дает предупреждение:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
математика

24

Вы можете создать класс, расширяющий ArrayList

class IndividualList extends ArrayList<Individual> {

}

а затем создать массив

IndividualList[] group = new IndividualList[10];

17

Я совершенно не понимаю, почему все предлагают тип генриков в массиве специально для этого вопроса.

Что делать, если мне нужно, чтобы индексировать nразличных массивов.

С объявлением List<List<Integer>>мне нужно создавать n ArrayList<Integer>объекты вручную или использовать цикл for для создания nсписков или каким-либо другим способом, в любом случае, моя обязанность - создавать nсписки.

Разве это не здорово, если мы объявим это через кастинг как List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]. Я вижу в этом хороший дизайн, когда не нужно создавать все индексирующие объекты (массивы) самостоятельно.

Может ли кто-нибудь просветить меня, почему этот (массив) будет плохим дизайном и каковы его недостатки?


AFAICT, похоже, что-то вроде менталитета культового груза, вызванного ужасной системой типизации, которую Java предлагает.
BrainSlugs83

@smsIce: это неплохой дизайн. Проблема в том, что многие авторы не читают полный вопрос или не понимают его четко.
Testo

16

Вы можете создать Array of ArrayList

List<Integer>[] outer = new List[number];
for (int i = 0; i < number; i++) {
    outer[i] = new ArrayList<>();
}

Это будет полезно в подобных сценариях. Вы знаете размер внешнего. Но размер внутренних варьируется. Здесь вы можете создать массив фиксированной длины, который содержит изменяющиеся по размеру списки массивов. Надеюсь, это будет полезно для вас.

В Java 8 и выше вы можете сделать это намного лучше.

List<Integer>[] outer = new List[number];
Arrays.setAll(outer, element -> new ArrayList<>());

Еще лучше, используя ссылку на метод

List<Integer>[] outer = new List[10];
Arrays.setAll(outer,  ArrayList :: new);

2
Когда вы используете ArrayList::new, он будет вызывать ArrayList(int)contructor с текущим индексом в качестве аргумента - ArrayList (1), ArrayList (2), ArrayList (3) и т. Д. Таким образом, вы получите в результате либо массивы меньшего или большего размера, в зависимости от вашего использования. Я бы не рекомендовал использовать его и вместо этого предпочел бы второй подход, когда вы сами вызываете конструктор в своем лямбда-выражении.
Genhis

8

Это работает, массив ArrayList. Дайте ему попытку понять, как это работает.

import java.util.*;

public class ArrayOfArrayList {
    public static void main(String[] args) {

        // Put the length of the array you need
        ArrayList<String>[] group = new ArrayList[15];
        for (int x = 0; x < group.length; x++) {
            group[x] = new ArrayList<>();
        }

        //Add some thing to first array
        group[0].add("Some");
        group[0].add("Code");

        //Add some thing to Secondarray
        group[1].add("In here");

        //Try to output 'em
        System.out.println(group[0]);
        System.out.println(group[1]);
    }
}

Кредиты для Kelvincer для некоторых кодов.


6

Проблема в этой ситуации состоит в том, что при использовании массива ArrayList вы получаете временную сложность o (n) для добавления в определенной позиции. Если вы используете массив, вы создаете область памяти, объявляя ваш массив, поэтому он постоянный


Добавление в определенной позиции O (n) для массива и ArrayList. Заполнение также O (n) для массивов и ArrayList.
Навин

2
Добавление в определенной позиции O (1) для массивов. Это O (n) для ArrayList, но O (1) для массивов.
Авиет

3

Вы не можете создать массив универсального типа. Создать список ArrayLists:

 List<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>();

или если вам действительно нужен массив (ВНИМАНИЕ: плохой дизайн!):

 ArrayList[] group = new ArrayList[4];

2
  1. Создание и инициализация

    Object[] yourArray = new Object[ARRAY_LENGTH];
  2. Доступ для записи

    yourArray[i]= someArrayList;

    для доступа к элементам внутреннего ArrayList:

    ((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
  3. Доступ для чтения

    чтобы прочитать элемент массива i в качестве приведения типа ArrayList:

    someElement= (ArrayList<YourType>) yourArray[i];

    для элемента массива i: прочитать элемент ArrayList по индексу j

    arrayListElement= ((ArrayList<YourType>) yourArray[i]).get(j);

2

List [] listArr = new ArrayList [4];

Выше строки выдает предупреждение, но оно работает (т.е. создает Array of ArrayList)


1

Чтобы объявить массив ArrayLists статически для, скажем, позиций спрайтов как Points:

ArrayList<Point>[] positionList = new ArrayList[2];

public Main(---) {
    positionList[0] = new ArrayList<Point>(); // Important, or you will get a NullPointerException at runtime
    positionList[1] = new ArrayList<Point>();
}

динамически:

ArrayList<Point>[] positionList;
int numberOfLists;

public Main(---) {
    numberOfLists = 2;
    positionList = new ArrayList[numberOfLists];
    for(int i = 0; i < numberOfLists; i++) {
        positionList[i] = new ArrayList<Point>();
    }
}

Несмотря на предостережения и некоторые сложные предложения, я обнаружил, что массив ArrayLists является элегантным решением для представления связанных ArrayLists одного типа.



1

Вы можете создать так ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];

Вы должны создать массив не универсального типа, а затем преобразовать его в универсальный.



0

Я считаю, что это проще в использовании ...

static ArrayList<Individual> group[];
......
void initializeGroup(int size)
{
 group=new ArrayList[size];
 for(int i=0;i<size;i++)
 {
  group[i]=new ArrayList<Individual>();
 }

0

Ты можешь сделать это :

// Создать массив типа ArrayList

`ArrayList<Integer>[] a = new ArrayList[n];`

// Для каждого элемента в массиве создаем ArrayList

for(int i=0; i<n; i++){ 
    a[i] = new ArrayList<Integer>();
}


-1

Вы можете создать список [] и инициализировать их с помощью цикла for. компилируется без ошибок:

List<e>[] l;
for(int i = 0; i < l.length; i++){
    l[i] = new ArrayList<e>();
}

он также работает с arrayList [] l.


2
l.lengthне определено в цикле for. Это может быть ошибка во время выполнения.
bourbaki4481472

l не инициализируется, чтобы иметь длину, это все еще нулевой указатель, когда он достигает цикла for. т.е. список <e> [] l = новый список [ДЛИНА];
Эрик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.