Я хочу створити масив масиву, як показано нижче:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
Але це не складання. Як я можу це зробити?
Я хочу створити масив масиву, як показано нижче:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
Але це не складання. Як я можу це зробити?
Відповіді:
Відповідно до документації Oracle :
"Ви не можете створювати масиви параметризованих типів"
Натомість ви можете зробити:
ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);
Як запропонував Том Хоттінг - таклін, ще краще зробити:
List<List<Individual>> group = new ArrayList<List<Individual>>(4);
List<List<Individual>> group = new ArrayList<List<Individual>>();
певно, було б краще.
Як згадували інші, можливо, краще використовувати інший список для зберігання ArrayList, але якщо вам доведеться використовувати масив:
ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
ArrayList<String>[] group = new ArrayList[4]
)? Яку додаткову користь роблять ролі?
new ArrayList<?>[N]
щоб не використовувати необроблений тип.
Це працює:
ArrayList<String>[] group = new ArrayList[4];
ArrayList<String>
замість ArrayList<NotString>
) group
, не компілюється
Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Ви можете створити клас, що розширює ArrayList
class IndividualList extends ArrayList<Individual> {
}
а потім створити масив
IndividualList[] group = new IndividualList[10];
Я абсолютно не розумію, чому всі пропонують генічний тип через масив, особливо для цього питання.
Що робити, якщо моя потреба полягає в індексації n
різних масивів.
Заявляючи, що List<List<Integer>>
мені потрібно створити n
ArrayList<Integer>
об'єкти вручну або поставити цикл для створення n
списків чи яким-небудь іншим способом, будь-яким чином завжди буде моїм обов’язком створювати n
списки.
Хіба це не чудово, якщо ми оголосимо це через кастинг як List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]
. Я вважаю це гарним дизайном, коли не потрібно створювати всі об’єкти індексації (масиви) самостійно
Хтось може мене просвітити, чому ця (масив) буде поганою конструкцією і які її недоліки?
Ви можете створити 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);
ArrayList::new
, він викличе ArrayList(int)
контролер з поточним індексом в якості аргументу - ArrayList (1), ArrayList (2), ArrayList (3) і т.д. залежно від використання. Я б відмовився від його використання і натомість віддав перевагу другому підходу, коли ви самі називаєте конструктор у своєму лямбда-виразі.
Це працює, масив 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]);
}
}
Подяки Келвінгеру за деякі коди.
Проблема з цією ситуацією полягає в тому, що, використовуючи араліст, ви отримуєте часову складність o (n) для додавання в конкретній позиції. Якщо ви використовуєте масив, ви створюєте місце пам'яті, оголошуючи масив, тому він є постійним
Ви не можете створити масив загального типу. Створити список списків масивів:
List<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>();
або якщо вам дійсно потрібен масив (УВАГА: поганий дизайн!):
ArrayList[] group = new ArrayList[4];
Створення та ініціалізація
Object[] yourArray = new Object[ARRAY_LENGTH];
Пишіть доступ
yourArray[i]= someArrayList;
для доступу до елементів внутрішнього ArrayList:
((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
Доступ для читання
для читання елемента масиву i як кастингу типу ArrayList:
someElement= (ArrayList<YourType>) yourArray[i];
для елемента масиву i: для зчитування елемента ArrayList в індексі j
arrayListElement= ((ArrayList<YourType>) yourArray[i]).get(j);
Щоб статично оголосити масив 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 того ж типу.
ArrayList<Integer>[] graph = new ArrayList[numCourses]
Це працює.
Мені це зручніше використовувати ...
static ArrayList<Individual> group[];
......
void initializeGroup(int size)
{
group=new ArrayList[size];
for(int i=0;i<size;i++)
{
group[i]=new ArrayList<Individual>();
}
Ви можете зробити це:
// Створення масиву типу ArrayList
`ArrayList<Integer>[] a = new ArrayList[n];`
// Для кожного елемента масиву зробіть ArrayList
for(int i=0; i<n; i++){
a[i] = new ArrayList<Integer>();
}
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
al[i] = new ArrayList<String>();
}
ви можете створити Список [] та ініціалізувати їх для циклу. вона компілюється без помилок:
List<e>[] l;
for(int i = 0; i < l.length; i++){
l[i] = new ArrayList<e>();
}
він також працює з arrayList [] l.
l.length
не визначено у циклі for. Це може бути помилка виконання.