2011-10-29 11 views
16

Ho un array come questo:Rimuovere una stringa specifica da un array di stringhe

String n[] = {"google","microsoft","apple"}; 

Quello che voglio fare è quello di rimuovere "mela".

Il mio problema è molto semplice, tuttavia, ho cercato il sito Web e ho scoperto che java non supporta realmente la funzionalità di eliminazione da un array. Ho anche sentito usare Java Utils, perché è così semplice rimuovere un elemento .... Ho cercato di trovare Java Utils su google, ma quasi tutti i link sono morti.

Quindi, finalmente ... c'è un modo per rimuovere una stringa da una serie di stringhe?

Anche se utilizzo un oggetto ArrayList non riesco a trovare un metodo per generare un elemento casuale al suo interno! Per esempio: in una matrice normale ho generare una stringa come questa:

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

In un ArrayList non funziona .... forse sapete una soluzione ...

+0

probabilmente ti è stato segnalato il pacchetto 'java.util', che contiene alcune delle classi gente qui sotto sono usando per rispondere alla tua domanda, come ad esempio' list' e 'ArrayList', e che viene fornito con lo standard Libreria Java: non è necessario un download separato. –

+5

NO !! Vuoi rimuovere Microsoft. –

risposta

26

Definire "remove".

Le matrici sono di lunghezza fissa e non possono essere ridimensionate una volta create.È possibile impostare un elemento su null per rimuovere un riferimento a un oggetto;

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

o

myStringArray[indexOfStringToRemove] = null; 

Se si desidera un array di dimensioni in modo dinamico in cui l'oggetto viene effettivamente rimosso e l'elenco (array) dimensione è regolata di conseguenza, utilizzare un ArrayList<String>

myArrayList.remove(stringToRemove); 

o

myArrayList.remove(indexOfStringToRemove); 

Modifica in risposta alla modifica del PO alla sua domanda e commento qui sotto

String r = myArrayList.get(rgenerator.nextInt(myArrayList.size())); 
+0

va bene, ma ho anche bisogno di generare un elemento casuale da quella lista .... In un array normale è fatto facilmente, tuttavia in un arraylist è piuttosto difficile da ... Se sai come dirmi ... – user1015311

+0

Perché sarebbe "difficile da fare"? Un ArrayList ti dà lo stesso accesso casuale di un array (tramite l'indice). Vedi la mia modifica sopra. –

+1

Si consiglia di utilizzare (myStringArray [i] .equalsIgnoreCase (stringToRemove)). Ciò assicurerà che, indipendentemente dal tipo di input dell'utente, la custodia non impedisca la rimozione della stringa dall'array. – Fergus

1

array in Java aren' t dinamico, come le classi di raccolta. Se si desidera una raccolta vera che supporti l'aggiunta dinamica e la cancellazione, utilizzare ArrayList <>. Se vuoi continuare a vivere con gli array di vaniglia, trova l'indice di stringa, costruisci un nuovo array con dimensione inferiore a quella originale e usa System.arraycopy() per copiare gli elementi prima e dopo. Oppure scrivi un ciclo di copia con skip a mano, su piccoli array la differenza sarà trascurabile.

1

Non è possibile rimuovere nulla da un array - sono sempre di lunghezza fissa. Una volta creata una matrice di lunghezza 3, quella matrice avrà sempre la lunghezza 3.

Sarebbe meglio con uno List<String>, ad es. 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 

Collections come questo sono generalmente molto più flessibile di lavorare con gli array direttamente.

EDIT: Per la rimozione:

void removeRandomElement(List<?> list, Random random) 
{ 
    int index = random.nextInt(list.size()); 
    list.remove(index); 
} 
+0

va bene, ma ho anche bisogno di generare un elemento casuale da quella lista .... In un array normale è fatto facilmente, tuttavia in un arraylist è piuttosto difficile da ... Se sai come dirmi ... – user1015311

+0

@ user1015311: No, lo faresti allo stesso modo di un array: rimuovi solo in base all'indice anziché al valore. C'è un sovraccarico di 'remove' che prende un' int'. Basta creare un numero casuale nell'intervallo '[0, list.size()]' quindi chiamare 'list.remove (index);'. –

9

non è possibile in sul passo o è necessario mantenere il riferimento alla matrice. Se è possibile modificare il riferimento questo può aiutare:

 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()]); 

io non consiglio i seguenti, ma se vi preoccupate per le prestazioni:

 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++; 
     }  
     } 

io non lo consiglio perché il codice è molto più difficile da leggi e mantieni.

+0

Per non dire orribilmente inefficiente; tutto ciò che copia non è gratuito. Questo è il motivo per cui ArrayList è stato inventato. –

0
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); 
    } 
} 
Problemi correlati