Создать Массив 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);
MByD
источник
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];
kelvincer
источник
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];
user2558221
источник
17

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

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

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

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

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

smslce
источник
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 одного типа.

Androidcoder
источник
1
ArrayList<String>[] lists = (ArrayList<String>[])new ArrayList[10]; 
Labeo
источник
1

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

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

Tejendra
источник
1

ArrayList<Integer>[] graph = new ArrayList[numCourses] Оно работает.

Сянькунь чжу
источник
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>();
 }
Creative_Cimmons
источник
0

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

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

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

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

for(int i=0; i<n; i++){ 
    a[i] = new ArrayList<Integer>();
}
Нишант Салхотра
источник
0
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
   al[i] = new ArrayList<String>();
}
HeadAndTail
источник
-1

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

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

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

user3539906
источник
2
l.lengthне определено в цикле for. Это может быть ошибка во время выполнения.
bourbaki4481472
l не инициализируется, чтобы иметь длину, это все еще нулевой указатель, когда он достигает цикла for. т.е. список <e> [] l = новый список [ДЛИНА];
Эрик