Я хочу создать массив arraylist, как показано ниже:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
Но это не компиляция. Как я могу это сделать?
Я хочу создать массив arraylist, как показано ниже:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
Но это не компиляция. Как я могу это сделать?
Ответы:
Согласно документации Oracle :
«Вы не можете создавать массивы параметризованных типов»
Вместо этого вы можете сделать:
ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);
Как предположил Том Хоутинг - tackline, это еще лучше сделать:
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>
объекты вручную или использовать цикл for для создания 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)
contructor с текущим индексом в качестве аргумента - 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]);
}
}
Кредиты для Kelvincer для некоторых кодов.
Проблема в этой ситуации состоит в том, что при использовании массива ArrayList вы получаете временную сложность o (n) для добавления в определенной позиции. Если вы используете массив, вы создаете область памяти, объявляя ваш массив, поэтому он постоянный
Вы не можете создать массив универсального типа. Создать список ArrayLists:
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 статически для, скажем, позиций спрайтов как 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>();
}
Вы можете создать список [] и инициализировать их с помощью цикла for. компилируется без ошибок:
List<e>[] l;
for(int i = 0; i < l.length; i++){
l[i] = new ArrayList<e>();
}
он также работает с arrayList [] l.
l.length
не определено в цикле for. Это может быть ошибка во время выполнения.