Je veux créer un tableau d'arraylist comme ci-dessous:
ArrayList<Individual>[] group = new ArrayList<Individual>()[4]
Mais ce n'est pas la compilation. Comment puis-je faire ceci?
Selon Documentation Oracle :
"Vous ne pouvez pas créer de tableaux de types paramétrés"
Au lieu de cela, vous pourriez faire:
ArrayList<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>(4);
Comme suggéré par Tom Hawting - tackline, il est encore mieux de faire:
List<List<Individual>> group = new ArrayList<List<Individual>>(4);
Comme d'autres l'ont mentionné, il est probablement préférable d'utiliser une autre liste pour stocker le tableau ArrayList, mais si vous devez utiliser un tableau:
ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
Cela marche:
ArrayList<String>[] group = new ArrayList[4];
Vous pouvez créer une classe qui étend ArrayList
class IndividualList extends ArrayList<Individual> {
}
puis créer le tableau
IndividualList[] group = new IndividualList[10];
Je ne comprends absolument pas, pourquoi tout le monde suggère le type génrique plutôt que sur le tableau, en particulier pour cette question.
Et si mon besoin est d’indexer n
différents arraylists.
Pour déclarer List<List<Integer>>
, je dois créer des objets n
ArrayList<Integer>
manuellement ou placer une boucle for pour créer des listes n
ou d’une autre manière. De toute façon, il sera toujours de mon devoir de créer des listes n
.
N'est-ce pas formidable si nous le déclarons par le biais du casting comme étant List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]
. Je le vois comme un bon design où il n’est pas nécessaire de créer tout l’objet d’indexation (arraylists) tout seul.
Quelqu'un peut-il m'expliquer pourquoi cela (tableau) sera un mauvais design et quels sont ses inconvénients?
Vous pouvez créer un tableau de tableauListe
List<Integer>[] outer = new List[number];
for (int i = 0; i < number; i++) {
outer[i] = new ArrayList<>();
}
Cela sera utile dans des scénarios comme celui-ci. Vous connaissez la taille de l'extérieur. Mais la taille des intérieurs varie. Ici, vous pouvez créer un tableau de longueur fixe contenant des listes de tableaux variant en taille. J'espère que cela vous sera utile.
Dans Java 8 et au-dessus, vous pouvez le faire d'une bien meilleure façon.
List<Integer>[] outer = new List[number];
Arrays.setAll(outer, element -> new ArrayList<>());
Encore mieux en utilisant référence de la méthode
List<Integer>[] outer = new List[10];
Arrays.setAll(outer, ArrayList :: new);
Le problème avec cette situation est qu'en utilisant un arraylist, vous obtenez une complexité temporelle de o(n) pour l'ajouter à un poste spécifique. Si vous utilisez un tableau, vous créez un emplacement mémoire en déclarant votre tableau, il est donc constant.
Cela fonctionne, tableau de ArrayList. Essayez de comprendre comment cela fonctionne.
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]);
}
}
Crédits à Kelvincer pour certains codes.
Vous ne pouvez pas créer de tableau de type générique. Créer une liste de tableaux:
List<ArrayList<Individual>> group = new ArrayList<ArrayList<Individual>>();
ou si vous avez VRAIMENT besoin de tableau (ATTENTION: mauvais design!):
ArrayList[] group = new ArrayList[4];
Création et initialisation
Object[] yourArray = new Object[ARRAY_LENGTH];
Accès en écriture
yourArray[i]= someArrayList;
pour accéder aux éléments internes de ArrayList:
((ArrayList<YourType>) yourArray[i]).add(elementOfYourType); //or other method
Accès en lecture
pour lire un élément de tableau i en tant que ArrayList, utilisez le transtypage de type:
someElement= (ArrayList<YourType>) yourArray[i];
pour l'élément de tableau i: pour lire l'élément ArrayList à l'index j
arrayListElement= ((ArrayList<YourType>) yourArray[i]).get(j);
List [] listArr = new ArrayList [4];
La ligne ci-dessus donne un avertissement, mais cela fonctionne (c.-à-d. Qu'il crée un tableau de ArrayList)
Pour déclarer un tableau de ArrayLists de manière statique pour, disons, les positions des sprites sous forme de 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>();
}
dynamiquement:
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>();
}
}
En dépit des mises en garde et de certaines suggestions complexes, j'ai trouvé qu'un ensemble de ArrayLists constituait une solution élégante pour représenter des ArrayLists associés du même type.
ArrayList<Integer>[] graph = new ArrayList[numCourses]
Il fonctionne.
ArrayList<String> al[] = new ArrayList[n+1];
for(int i = 0;i<n;i++){
al[i] = new ArrayList<String>();
}
ArrayList<String>[] lists = (ArrayList<String>[])new ArrayList[10];
Je trouve cela plus facile à utiliser ...
static ArrayList<Individual> group[];
......
void initializeGroup(int size)
{
group=new ArrayList[size];
for(int i=0;i<size;i++)
{
group[i]=new ArrayList<Individual>();
}
Tu peux le faire :
// Créer un tableau de type ArrayList
`ArrayList<Integer>[] a = new ArrayList[n];`
// Pour chaque élément du tableau, créez une ArrayList.
for(int i=0; i<n; i++){
a[i] = new ArrayList<Integer>();
}