Створіть масив Arraylists


175

Я хочу створити масив масиву, як показано нижче:

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

Але це не складання. Як я можу це зробити?


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

13
@SeanPatrickFloyd Чи можете ви пояснити, чому масиви - кошмар у використанні?
користувач

3
@crucifiedsoul обов'язково. масив не може зростати, ви не можете нічого вставити в масив, масив не замінює стандартні методи, такі як хеш-код або toString тощо.
Шон Патрік Флойд

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

4
Гаразд, це старе питання, але я все одно буду задавати питання, чи хтось відповість. Я бачу всіх, хто розмовляє про те, чому масив списків - жахлива ідея, погана практика кодування тощо. Я роздивився це, тому що я вчуся робити хеш-ланцюги, а визначення хеш-ланцюга - це масив списків! То як саме центральна структура даних програмування може бути жахливою практикою кодування? Або це просто потрапляє в категорію IYKWYD, згадану @Sean?
jimboweb

Відповіді:


142

Відповідно до документації Oracle :

"Ви не можете створювати масиви параметризованих типів"

Натомість ви можете зробити:

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

Як запропонував Том Хоттінг - таклін, ще краще зробити:

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

20
List<List<Individual>> group = new ArrayList<List<Individual>>();певно, було б краще.
Том Хотін - тайклін

4
Що означає "не може створити масив загального типу"? Це насправді не має сенсу для мене, тому що це не є загальним, якщо ви надаєте те, що його повинні вважати, правда?
Енді

5
Я здивований нагородам, оскільки це не відповідає на питання (тобто я хочу це зробити, як це зробити). За винятком, можливо, 1-го речення.
Флоріан Ж

15
чому посилання на List краще, ніж ArrayList?
шифу

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

98

Як згадували інші, можливо, краще використовувати інший список для зберігання ArrayList, але якщо вам доведеться використовувати масив:

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

4
Здається, ніхто не пояснює, чому мені подобається ваш фрагмент вище. чому ви рекомендуєте використовувати список над цим?
clankill3r

3
Якщо група масивів не змінюється, то такий підхід кращий, оскільки масиви швидші, ніж класи <>.
Борж

33
Дякуємо, що реально відповіли на питання. Немає логічної причини автоматично вважати, що список є кращим для масиву без додаткового контексту.
Спеціальний соус

3
Будь-яка причина, чому це було б кращим над @kelvincer Answer ( ArrayList<String>[] group = new ArrayList[4])? Яку додаткову користь роблять ролі?
cellepo

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>об'єкти вручну або поставити цикл для створення nсписків чи яким-небудь іншим способом, будь-яким чином завжди буде моїм обов’язком створювати nсписки.

Хіба це не чудово, якщо ми оголосимо це через кастинг як List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]. Я вважаю це гарним дизайном, коли не потрібно створювати всі об’єкти індексації (масиви) самостійно

Хтось може мене просвітити, чому ця (масив) буде поганою конструкцією і які її недоліки?


АФАКТИЧНО, здається, це свого роду культовий менталітет, викликаний жахливою системою набору тексту, яку Java подає до столу.
BrainSlugs83

@smsIce: Це не поганий дизайн. Проблема полягає в тому, що багато письменників не читають повного питання або не розуміють його чітко.
тесто

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)контролер з поточним індексом в якості аргументу - ArrayList (1), ArrayList (2), ArrayList (3) і т.д. залежно від використання. Я б відмовився від його використання і натомість віддав перевагу другому підходу, коли ви самі називаєте конструктор у своєму лямбда-виразі.
Генхіс

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]);
    }
}

Подяки Келвінгеру за деякі коди.


6

Проблема з цією ситуацією полягає в тому, що, використовуючи араліст, ви отримуєте часову складність o (n) для додавання в конкретній позиції. Якщо ви використовуєте масив, ви створюєте місце пам'яті, оголошуючи масив, тому він є постійним


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

2
Додавання у визначеному положенні є O (1) для масивів. Це O (n) для ArrayList, але O (1) для масивів.
aviemet

3

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

 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 = новий ArrayList [4];

Наведена вище лінія попереджає, але вона працює (тобто створює Array of ArrayList)


1

Щоб статично оголосити масив ArrayLists для, скажімо, sprite позицій як 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>();
}

0
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
   al[i] = new ArrayList<String>();
}

-1

ви можете створити Список [] та ініціалізувати їх для циклу. вона компілюється без помилок:

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.