2017-08-15 2 views
0

Je voudrais savoir comment initialiser un ArrayList qui a un nombre illimité de valeurs prédéfinies, afin que je puisse accéder à un élément d'un index arbitraire et mettre à jour sa valeur.ArrayList avec des valeurs prédéfinies illimitées

Par exemple, le ArrayList testArrayList serait lancé avec toute valeur int0, je pouvais immédiatement utiliser testArrayList.set(123, 15) pour définir l'élément 124e dans le ArrayList à 15 au lieu d'obtenir une sortie d'exception liée. Quand je fais des requêtes comme testArrayList.get(99999), j'obtiendrais la valeur prédéfinie 0.

J'ai essayé d'initialiser une ArrayList d'abord, puis d'utiliser une boucle for pour y ajouter 0 s, mais je dois décider quelle devrait être la taille initiale de ArrayList. Si j'ai fait un ArrayList puis immédiatement ajouter 100 0 s, je ne pouvais pas faire un .get(200) dessus avant d'ajouter une autre quantité de 0 s.

Est-ce que ce que je recherche est possible avec ArrayList? Si non, recommanderiez-vous des solutions alternatives?

Merci. Edit: La raison pour laquelle je voulais une liste, c'est que je voulais pouvoir la parcourir dans l'ordre. Je fais un simple programme de type calendrier, où je pourrais ajouter/récupérer/modifier des "notes" d'une "date" arbitraire, mais aussi capable d'imprimer les notes de chaque "jour" donné pour une période spécifique.

+1

Peut-être que vous pouvez décrire le problème que vous essayez de résoudre, ce qui vous a incité à poser cette question. –

+0

Pourquoi avez-vous besoin d'une liste avec des valeurs prédéfinies illimitées? – hamena314

+2

Implémentez votre propre ArrayList, et ajoutez votre exigence aux méthodes – azro

Répondre

1

Il ne semble pas qu'un ArrayList (ou n'importe quel type de List) est vraiment que vous voulez. On dirait que vous voulez un Map.

Mais si vous voulez comme un ArrayList, vous pouvez sous-classe et passer outre get et set de telle sorte qu'ils vérifient si la liste est assez grand pour l'index et, sinon, le remplir au point où il est.

Librement, pour set:

@Override 
public E set(int index, E element) { 
    if (this.size() <= index) { 
     this.ensureCapacity(index + 1); 
     for (int n = this.size(); n <= index; ++n) { 
      this.set(n, 0); 
     } 
    } 
    return super.set(index, element); 
} 

Mais, encore une fois, il semble comme un Map pourrait être un meilleur choix.

4

Vous ne voulez pas créer un ArrayList, car pour alimenter la 99999 « e index, vous devrez remplir les indices 0-99998 premier, ce qui est un gaspillage.

Une HashMap<Integer,Integer> est une meilleure option, car vous ne remplissez que les index qui vous intéressent. Une clé avec une clé avec une clé Integer peut être considérée comme si vous mappez les index de votre "ArrayList éparpillée" dans un petit tableau, ce qui réduit les besoins de stockage tout en gardant les temps d'insertion et de recherche attendus constants.

Par exemple:

Map<Integer,Integer> map = new HashMap<>(); 
int value = map.getOrDefault(99999,0); // this will return 0 if the Map has no value 
             // for the key 99999 
map.put (99999, value + 1); 

EDIT: voir votre exigence de l'ordre d'itération, vous pouvez utiliser TreeMap<Integer,Integer> au lieu de HashMap<Integer,Integer>. De cette façon, itérer sur les touches sera toujours en fonction de leur ordre numérique.

+0

Merci, je vais essayer avec TreeMap. – gcarol

0

Vous demandez comment remplir un tableau peu peuplé à la volée. À ma connaissance, il n'y a rien de tel dans les bibliothèques intégrées Java.

espace Option:

  • utiliser une autre structure de données, qui est plus adapté pour le contenu "rares". Quel est le point d'avoir 123 emplacements vides? Lorsque vous avez juste un créneau avec un contenu réel ... une carte pourrait mieux répondre à vos besoins.
  • vous pouvez toujours mettre en œuvre votre propre version de la liste qui « crée » tous les emplacements vides sur la demande
0

Masquer l'accès à la liste derrière une méthode personnalisée. Récupère l'index de façon défensive, si la liste ne contient pas assez d'éléments, ajoute les éléments par défaut à la liste jusqu'à ce qu'elle atteigne l'index désiré. Si l'indice suivant est inférieur ou égal à la taille, récupérez cet index. Sinon répétez.

Il n'y a pas de structure par défaut avec des valeurs par défaut illimitées (ce ne serait pas très efficace). En masquant la liste comme décrit ci-dessus, vous n'avez que le nombre d'éléments dont vous avez besoin (ou dont vous pensez avoir besoin).