Quelle est la meilleure façon de supprimer le premier élément d'un tableau?

86

J'ai un tableau de chaînes ( String[]) et je dois supprimer le premier élément. Comment puis-je faire cela efficacement?

NullVoxPopuli
la source
duplication possible de Comment supprimer des objets d'un tableau en java?
McDowell
4
Pas une dupe. La question précédente concerne la suppression d'éléments par valeur; il s'agit de supprimer un élément par index.
james.garriss

Réponses:

154

La taille des tableaux en Java ne peut pas être modifiée. Donc, techniquement, vous ne pouvez supprimer aucun élément du tableau.

Une façon de simuler la suppression d'un élément du tableau consiste à créer un nouveau tableau plus petit, puis à copier tous les éléments du tableau d'origine dans le nouveau tableau plus petit.

String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);

Cependant , je ne suggérerais pas la méthode ci-dessus. Vous devriez vraiment utiliser un fichier List<String>. Les listes vous permettent d'ajouter et de supprimer des éléments de n'importe quel index. Cela ressemblerait à ce qui suit:

List<String> list = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item
jjnguy
la source
32
Il est important de noter que la suppression du premier élément de an ArrayListest O (n).
Matthew Flaschen
1
@Matt, pour un tableau et la liste. Mais le code est bien plus simple pour la liste.
jjnguy
16
Pour un tableau et un ArrayList, mais pas pour LinkedList.
Matthew Flaschen
4
Sur) ? bien .. dans un tableau C? pour supprimer le premier élément, vous pouvez simplement incrémenter le pointeur O (1)
Hernán Eche
2
Pour ceux qui utilisent Java pour Android comme moi, Arrays.copyOfRange()c'est pour API9 +
Sdghasemi
14

Le moyen le plus simple est probablement le suivant - vous devez essentiellement construire un nouveau tableau d'un élément plus petit, puis copier les éléments que vous souhaitez conserver aux bonnes positions.

int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);

Notez que si vous effectuez fréquemment ce type d'opération, cela pourrait être le signe que vous devriez en fait utiliser un autre type de structure de données, par exemple une liste chaînée. Construire un nouveau tableau à chaque fois est une opération O (n), qui pourrait coûter cher si votre tableau est grand. Une liste chaînée vous donnerait la suppression O (1) du premier élément.

Une autre idée consiste à ne pas supprimer du tout le premier élément, mais simplement à incrémenter un entier qui pointe vers le premier index utilisé. Les utilisateurs du réseau devront prendre en compte ce décalage, mais cela peut être une approche efficace. La classe Java String utilise en fait cette méthode en interne lors de la création de sous-chaînes.

Mikera
la source
4
Ce n'est pas techniquement le moyen le plus simple. Arrays.copyOfRange()est.
jjnguy
4
Puisqu'il utilise Java6, il peut utiliser les Arrays plus compacts.copyOfRange
Thilo
1
@Justin - bien sûr, mais seulement si vous ciblez Java 1.6 ou supérieur
mikera
1
vrai. Ce n'est pas toujours applicable.
jjnguy
6
le titre de la question indique clairement que l'OP est intéressé par des réponses pour Java 1.6 et supérieur.
Stephen C
5

Vous ne pouvez pas le faire du tout, et encore moins rapidement. Les tableaux en Java sont de taille fixe. Deux choses que vous pourriez faire sont:

  1. Décalez chaque élément d'un élément vers le haut, puis définissez le dernier élément sur null.
  2. Créez un nouveau tableau, puis copiez-le.

Vous pouvez utiliser System.arraycopypour l'un ou l'autre. Ces deux éléments sont O (n), car ils copient tous les éléments sauf 1.

Si vous supprimez souvent le premier élément, envisagez d'utiliser à la LinkedListplace. Vous pouvez utiliser LinkedList.remove, qui provient de l' Queueinterface, pour plus de commodité. Avec LinkedList, la suppression du premier élément est O (1). En fait, supprimer n'importe quel élément est O (1) une fois que vous avez un ListIteratorà cette position. Cependant, accéder à un élément arbitraire par index est O (n).

Matthew Flaschen
la source
2

Conservez un index du premier élément "live" du tableau. Supprimer (faire semblant de supprimer) le premier élément devient alors une O(1)opération de complexité temporelle.

msw
la source
0

Pour résumer, la méthode de liste liée rapide:

List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);
mjad-org
la source
-8

Une autre méthode moche:

   String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
   String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");
Emil
la source
2
S'il vous plaît, quelqu'un avec une réputation suffisante évalue cette réponse - c'est exactement ce qu'elle dit - moche! Aucune intention d'être impoli, mais dans l'intérêt de la codéabilité, veuillez ne pas publier ce genre de chose!
Hack5
si vous utilisez déjà Arrays, il serait préférable d'utiliser Arrays.copyOfRange
Bishal Gautam
Il a demandé le meilleur moyen.
Sapphire_Brick
supprimez-le et voyez combien vous gagnerez en réputation.
Sapphire_Brick