2010-08-18 26 views
20

OK, ecco la mia ArrayList:Java - rimuovere ultimo elemento noto da ArrayList

private List<ClientThread> clients = new ArrayList<ClientThread>(); 

e qui è quello che sto cercando di fare:
Sto cercando di rimuovere l'ultimo elemento noto dal ArrayList Ho postato sopra. Sto cercando di fare questo con il codice qui sotto:

} catch(SocketException re) { 


          String hey = clients.get(clients.size()); 
          ClientThread.remove(hey); 
          System.out.println(hey + " has logged out."); 
          System.out.println("CONNECTED PLAYERS: " + clients.size()); 
} 

ma sto ottenendo questo errore:

C:\wamp\www\mystikrpg\Server.java:147: incompatible types 
found : Server.ClientThread 
required: java.lang.String 
         String hey = clients.get(clients.size()); 
               ^
C:\wamp\www\mystikrpg\Server.java:148: cannot find symbol 
symbol : method remove(java.lang.String) 
location: class Server.ClientThread 
         ClientThread.remove(hey); 
            ^
2 errors 

Che cosa sto facendo di sbagliato? Si suppone di rimuovere l'ultimo elemento conosciuto dal mio ArrayList.

risposta

62

Dovrebbe essere:

ClientThread hey = clients.get(clients.size() - 1); 
clients.remove(hey); 

Oppure si può fare

clients.remove(clients.size() - 1); 

Il meno quelli che sono perché la dimensione() restituisce il numero di elementi, ma indice di primo elemento del ArrayList è 0 e non 1.

+1

Si noti che quando si esegue l'override di '.equals()', è possibile utilizzare quest'ultima versione per assicurarsi che sia davvero l'ultimo oggetto rimosso. –

+1

Credo che la tua prima soluzione non funzionerebbe correttamente se ci fossero duplicati nella lista. Tuttavia, potrebbero esserci situazioni in cui si desidera tale funzionalità. – Pijusn

+3

Si noti che la rimozione di un oggetto da un elenco di array è O (n). Il secondo approccio è un tempo costante. – Alexander

0

Primo errore: stai lanciando un ClientThread come String per qualche motivo.

Secondo errore: non stai chiamando remove sul tuo List.

Is is homework? Se è così, potresti voler usare il tag.

8

Il compilatore si lamenta che si sta tentando di eseguire un elenco di oggetti ClientThread su un String. Cambiare il tipo di hey a ClientThread o clients a List<String>.

Inoltre: gli indici validi per gli elenchi vanno da 0 a size() - 1.

quindi probabilmente voglia di scrivere

String hey = clients.get(clients.size()-1); 
+0

+1 per aver capito che l'indice passato a 'get()' era sbagliato, non l'ho capito. –

3

Stai cercando di assegnare il valore di ritorno della clients.get(clients.size()) alla stringa hey, ma l'oggetto restituito è un ClientThread, non una stringa. Come Andre mentioned, è necessario utilizzare anche l'indice corretto.

Per quanto riguarda il secondo errore, non esiste il metodo statico remove() nel tipo ClientThread. In realtà, probabilmente volevi il metodo di rimozione dell'istanza List, clients.

È possibile rimuovere l'ultimo elemento dall'elenco, se presente, come segue. Dal momento che rimuovere restituisce anche l'oggetto che è stato rimosso, è possibile catturare il ritorno e utilizzarla per stampare il nome:

int size = clients.size(); 

if (size > 0) { 
    ClientThread client = clients.remove(size - 1); 

    System.out.println(client + " has logged out."); 
    System.out.println("CONNECTED PLAYERS: " + clients.size()); 
} 
+0

+1 per verificare se l'elenco è vuoto o non –

+0

+1 per l'uso di '.remove()' sull'oggetto giusto. Extra immaginario +1 per usare il valore di ritorno da remove(). –

1

clients.get restituirà un ClientThread e non una stringa, e sarà bombardare con un'IndexOutOfBoundsException se fosse compilato come Java è basato su 0 per l'indicizzazione.

Allo stesso modo, penso che dovresti chiamare la rimozione nell'elenco dei clienti.

     ClientThread hey = clients.get(clients.size()-1); 
         clients.remove(hey); 
         System.out.println(hey + " has logged out."); 
         System.out.println("CONNECTED PLAYERS: " + clients.size()); 

vorrei utilizzare le funzioni dello stack di un LinkedList in questo caso, però, vedere http://download.oracle.com/javase/1.4.2/docs/api/java/util/LinkedList.html

ClientThread hey = clients.removeLast() 
6

Questa linea significa che è istanziato un "Elenco di ClientThread oggetti".

private List<ClientThread> clients = new ArrayList<ClientThread>(); 

Questa riga presenta due problemi.

String hey = clients.get(clients.size()); 

1. Questa parte della linea:

clients.get(clients.size()); 

SEMPRE getta IndexOutOfBoundsException perché una dimensione collezioni è sempre uno più grande rispetto al suo indice di ultimi elementi;

2. Il compilatore si lamenta di tipi incompatibili perché non è possibile assegnare un oggetto ClientThread all'oggetto String. La corretta dovrebbe essere come questa.

ClientThread hey = clients.get(clients.size()-1); 

Ultimo ma non meno importante. Se si conosce indice dell'oggetto da rimuovere basta scrivere

clients.remove(23); //Lets say it is in 23. index 

Non scrivere

ClientThread hey = clients.get(23); 

    clients.remove(hey); 

perché si stanno costringendo la lista per cercare l'indice che si conosce già. Se si prevede di fare qualcosa con l'oggetto rimosso in seguito. Scrivi

ClientThread hey = clients.remove(23); 

In questo modo è possibile rimuovere l'oggetto e ottenere un riferimento ad esso sulla stessa linea.

Bonus: non chiamare mai la variabile di istanza con il nome "hey". Trova qualcosa di significativo.

e qui è il vostro corretto e il codice pronto-to-run:

public class ListExampleForDan { 

    private List<ClientThread> clients = new ArrayList<ClientThread>(); 

    public static void main(String args[]) { 

     clients.add(new ClientThread("First and Last Client Thread")); 

     boolean success = removeLastElement(clients); 

     if (success) { 

      System.out.println("Last Element Removed."); 

     } else { 

      System.out.println("List Is Null/Empty, Operation Failed."); 

     } 

    } 

    public static boolean removeLastElement(List clients) { 

     if (clients == null || clients.isEmpty()) { 

      return false; 

     } else { 

      clients.remove(clients.size() - 1); 

      return true; 

     } 

    } 
} 

Enjoy!

0

È necessario comprendere java generics. Hai una lista di ClientThread ma stai cercando di ottenere String. Hai altri errori, ma questo è molto semplice.