J'ai un tableau de chaînes (String[]
) et je dois supprimer le premier élément. Comment puis-je le faire efficacement?
La taille des tableaux en Java ne peut pas être modifiée. Donc, techniquement, vous ne pouvez supprimer aucun élément du tableau.
Pour simuler la suppression d'un élément du tableau, vous pouvez 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 List<String>
. Les listes vous permettent d'ajouter et de supprimer des éléments de tout 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
La méthode la plus simple est probablement la suivante: vous devez en principe créer un nouveau tableau composé d'un élément plus petit, puis copier les éléments à conserver aux bons emplacements.
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 indiquer que vous devriez réellement utiliser un type de structure de données différent, par exemple. une liste liée. Construire un nouveau tableau à chaque fois est une opération O(n), qui peut coûter cher si votre tableau est grand. Une liste chaînée vous donnerait O(1) suppression 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 groupe devront prendre en compte cet offset, 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.
Vous ne pouvez pas le faire du tout, encore moins rapidement. Les tableaux en Java ont une taille fixe. Vous pouvez faire deux choses:
Vous pouvez utiliser System.arraycopy
pour l’un ou l’autre. Les deux sont O (n), car ils copient tous les éléments sauf 1.
Si vous supprimez souvent le premier élément, envisagez plutôt d'utiliser LinkedList
. Vous pouvez utiliser LinkedList.remove
, qui provient de l'interface Queue
, par souci de commodité. Avec LinkedList
, supprimer le premier élément est O (1). En fait, supprimer tout élément est O(1) une fois que vous avez une ListIterator
à cette position. Cependant, l'accès à un élément arbitraire par index est O (n).
Conserve un index du premier élément "live" du tableau. Supprimer (en prétendant supprimer) le premier élément devient alors une opération de complexité temporelle O(1)
.
Pour résumer, la méthode rapide de liste liée:
List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);