web-dev-qa-db-fra.com

Supprimer une chaîne spécifique d'un tableau de chaînes

J'ai un tableau comme celui-ci:

String n[] = {"google","Microsoft","Apple"};

Ce que je veux faire est de supprimer "Apple". 

Mon problème est très simple, cependant, j’ai cherché sur le site Web et j’ai découvert que Java ne supportait pas vraiment la fonction de suppression d’un tableau. J’ai aussi entendu utiliser Java Utils, car c’est si simple de supprimer un élément .... J'ai essayé de trouver Java Utils sur Google, mais presque tous les liens sont morts.

Alors finalement ... y a-t-il un moyen de supprimer une chaîne d'un tableau de chaînes?

Même si j'utilise un ArrayList, je ne trouve pas de méthode pour générer un élément aléatoire! Par exemple: dans un tableau normal, je génère une chaîne comme celle-ci:

String r = myAL[rgenerator.nextInt(myAL.length)];

Dans un répertoire, cela ne fonctionne pas ... peut-être connaissez-vous une solution ...

17
user1015311

Définissez "supprimer".

Les tableaux ont une longueur fixe et ne peuvent pas être redimensionnés une fois créés. Vous pouvez définir un élément sur null pour supprimer une référence d'objet;

for (int i = 0; i < myStringArray.length(); i++)
{
    if (myStringArray[i].equals(stringToRemove))
    {
        myStringArray[i] = null;
        break;
    }
}

ou

myStringArray[indexOfStringToRemove] = null;

Si vous voulez un tableau de taille dynamique où l'objet est réellement supprimé et la taille de la liste (tableau) ajustée en conséquence, utilisez un ArrayList <String>

myArrayList.remove(stringToRemove); 

ou 

myArrayList.remove(indexOfStringToRemove);

Editer en réponse à l'édition de OP à sa question et à son commentaire ci-dessous

String r = myArrayList.get(rgenerator.nextInt(myArrayList.size()));
26
Brian Roach

Cela n'est pas possible dans l'étape ou vous devez conserver la référence au tableau . Si vous pouvez changer la référence, cela peut aider:

      String[] n = new String[]{"google","Microsoft","Apple"};
      final List<String> list =  new ArrayList<String>();
      Collections.addAll(list, n); 
      list.remove("Apple");
      n = list.toArray(new String[list.size()]);

Je ne recommande pas ce qui suit, mais si vous vous souciez de la performance:

      String[] n = new String[]{"google","Microsoft","Apple"};
      final String[] n2 = new String[2]; 
      System.arraycopy(n, 0, n2, 0, n2.length);
      for (int i = 0, j = 0; i < n.length; i++)
      {
        if (!n[i].equals("Apple"))
        {
          n2[j] = n[i];
          j++;
        }      
      }

Je ne le recommande pas car le code est beaucoup plus difficile à lire et à maintenir.

9
LuisKarlos

Les tableaux en Java ne sont pas dynamiques, comme les classes de collection. Si vous souhaitez une véritable collection prenant en charge l'ajout et la suppression dynamiques, utilisez ArrayList <>. Si vous voulez toujours utiliser les tableaux Vanilla, recherchez l'index de chaîne, construisez un nouveau tableau dont la taille est inférieure à l'original et utilisez System.arraycopy() pour copier les éléments avant et après. Ou écrivez une boucle de copie avec skip à la main, sur les petits tableaux, la différence sera négligeable.

1
Seva Alekseyev

Vous ne pouvez rien enlever d'un tableau - ils sont toujours de longueur fixe. Une fois que vous avez créé un tableau de longueur 3, ce tableau aura toujours une longueur de 3.

Vous seriez mieux avec un List<String>, par exemple. un ArrayList<String>:

List<String> list = new ArrayList<String>();
list.add("google");
list.add("Microsoft");
list.add("Apple");
System.out.println(list.size()); // 3

list.remove("Apple");
System.out.println(list.size()); // 2

De telles collections sont généralement beaucoup plus flexibles que de travailler directement avec des tableaux.

EDIT: pour l'enlèvement:

void removeRandomElement(List<?> list, Random random)
{
    int index = random.nextInt(list.size());
    list.remove(index);
}
1
Jon Skeet
import Java.util.*;

class Array {
    public static void main(String args[]) {
        ArrayList al = new ArrayList();
        al.add("google");
        al.add("Microsoft");
        al.add("Apple");
        System.out.println(al);
        //i only remove the Apple//
        al.remove(2);
        System.out.println(al);
    }
}
0
user2907433