Je pense que c'est une question assez simple, mais je ne peux pas comprendre comment le faire correctement.
J'ai un auteur vide:
ArrayList<object> list = new ArrayList<object>();
J'ai quelques objets à ajouter et chaque objet doit se trouver à une certaine position. Il faut toutefois qu'ils puissent être ajoutés dans chaque ordre possible. Quand j'essaye ça, ça ne marche pas et j'obtiens un IndexOutOfBoundsException
:
list.add(1, object1)
list.add(3, object3)
list.add(2, object2)
Ce que j'ai essayé, c'est de remplir la ArrayList
avec null
, puis de faire ce qui précède. Cela fonctionne, mais je pense que c'est une solution horrible. Y a-t-il une autre façon de faire cela?
Vous pouvez le faire comme ça:
list.add(1, object1)
list.add(2, object3)
list.add(2, object2)
Après avoir ajouté objet2 à la position 2, il déplacera objet3 à la position 3.
Si vous voulez que object3 soit constamment à la position3, je vous suggérerais d'utiliser une carte de hachage avec position comme clé et objet comme valeur.
Vous pouvez utiliser un tableau d’objets et le convertir en ArrayList.
Object[] array= new Object[10];
array[0]="1";
array[3]= "3";
array[2]="2";
array[7]="7";
List<Object> list= Arrays.asList(array);
ArrayList sera- [1, null, 2, 3, null, null, null, 7, null, null]
Si c'est le cas, alors pourquoi ne pas envisager d'utiliser un tableau standard, initialisez la capacité et placez les objets à l'index souhaité.
Object[] list = new Object[10];
list[0] = object1;
list[2] = object3;
list[1] = object2;
Vous pouvez également substituer ArrayList pour insérer des valeurs NULL entre votre taille et l'élément que vous souhaitez ajouter.
import Java.util.ArrayList;
public class ArrayListAnySize<E> extends ArrayList<E>{
@Override
public void add(int index, E element){
if(index >= 0 && index <= size()){
super.add(index, element);
return;
}
int insertNulls = index - size();
for(int i = 0; i < insertNulls; i++){
super.add(null);
}
super.add(element);
}
}
Ensuite, vous pouvez ajouter à tout moment dans ArrayList. Par exemple, cette méthode principale:
public static void main(String[] args){
ArrayListAnySize<String> a = new ArrayListAnySize<>();
a.add("zero");
a.add("one");
a.add("two");
a.add(5,"five");
for(int i = 0; i < a.size(); i++){
System.out.println(i+": "+a.get(i));
}
}
donne ce résultat depuis la console:
0: zéro
1 un
2: deux
3: null
4: null
5: cinq
J'attire votre attention sur la ArrayList.add
documentation , qui indique qu'elle jette IndexOutOfBoundsException
- si l'index est en dehors de la plage (index < 0 || index > size()
)
Vérifiez la size()
de votre liste avant d'appeler list.add(1, object1)
Vous devez renseigner les index vides avec des valeurs NULL.
while (arraylist.size() < position)
{
arraylist.add(null);
}
arraylist.add(position, object);
@Maethortje
The problem here is Java creates an empty list when you called new ArrayList and
en essayant d'ajouter un élément à la position spécifiée, vous avez obtenu IndexOutOfBound, de sorte que la liste devrait avoir certains éléments à leur position.
S'il vous plaît essayer de suivre
/*
Add an element to specified index of Java ArrayList Example
This Java Example shows how to add an element at specified index of Java
ArrayList object using add method.
*/
import Java.util.ArrayList;
public class AddElementToSpecifiedIndexArrayListExample {
public static void main(String[] args) {
//create an ArrayList object
ArrayList arrayList = new ArrayList();
//Add elements to Arraylist
arrayList.add("1");
arrayList.add("2");
arrayList.add("3");
/*
To add an element at the specified index of ArrayList use
void add(int index, Object obj) method.
This method inserts the specified element at the specified index in the
ArrayList.
*/
arrayList.add(1,"INSERTED ELEMENT");
/*
Please note that add method DOES NOT overwrites the element previously
at the specified index in the list. It shifts the elements to right side
and increasing the list size by 1.
*/
System.out.println("ArrayList contains...");
//display elements of ArrayList
for(int index=0; index < arrayList.size(); index++)
System.out.println(arrayList.get(index));
}
}
/*
Output would be
ArrayList contains...
1
INSERTED ELEMENT
2
3
*/
Que diriez-vous de cette petite boucle while
comme solution?
private ArrayList<Object> list = new ArrayList<Object>();
private void addObject(int i, Object object) {
while(list.size() < i) {
list.add(list.size(), null);
}
list.add(i, object);
}
....
addObject(1, object1)
addObject(3, object3)
addObject(2, object2)
C'est une solution possible:
list.add(list.size(), new Object());
Supposons que vous souhaitiez ajouter un élément à une position, la taille de la liste doit alors être supérieure à la position.
add(2, item)
: cette syntaxe signifie, déplace l'ancien élément de la position 2 vers l'index suivant et ajoute l'élément en 2e position.
S'il n'y a pas d'élément en 2ème position, cela ne fonctionnera pas, cela déclenchera une exception.
Cela signifie que si vous voulez ajouter quelque chose dans position 2,
votre taille de la liste doit être au moins (2 + 1) =3,
pour que les éléments soient disponibles à 0,1,2 Position.
de cette manière, il est garanti que la position 2 est accessible en toute sécurité et il n’y aurait pas d’exception.
Je pense que la solution de medopal est ce que vous recherchez.
Mais une autre solution consiste à utiliser un HashMap et à utiliser la clé (Integer) pour stocker des positions.
De cette façon, vous n'aurez pas besoin de le remplir avec des valeurs nuls, etc. au début, collez simplement la position et l'objet dans la carte au fur et à mesure. Vous pouvez écrire quelques lignes à la fin pour le convertir en liste si vous en avez besoin.
Un peu tard, mais j'espère que cela peut toujours être utile à quelqu'un.
2 étapes pour ajouter des éléments à une position spécifique dans un ArrayList
add
éléments null à un index spécifique dans un ArrayList
Ensuite, set
les positions selon les besoins.
list = new ArrayList();//Initialise the ArrayList
for (Integer i = 0; i < mItems.size(); i++) {
list.add(i, null); //"Add" all positions to null
}
// "Set" Items
list.set(position, SomeObject);
De cette façon, vous n'avez pas d'éléments redondants dans la ArrayList
c'est-à-dire si vous deviez ajouter des éléments tels que,
list = new ArrayList(mItems.size());
list.add(position, SomeObject);
Cela écraserait pas les éléments existants dans la position, en déplaçant ceux existants de un à la droite - de sorte que vous disposiez d'une ArrayList avec deux fois plus d'indices.
Si vous utilisez la version Android de Java, puis-je vous suggérer d'utiliser un SparseArray . Il s'agit d'un mappage des entiers avec des objets plus efficace en termes de mémoire et d'une itération plus facile qu'un mappage.
Vous devez définir au lieu d'ajouter pour remplacer la valeur existante à l'index.
list.add(1, object1)
list.add(2, object3)
list.set(2, object2)
La liste contiendra [objet1, objet2]