2010-08-18 13 views
20

OK, also hier ist mein ArrayList:Java - entfernen letzte bekannte Position aus Arraylist

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

und hier ist das, was ich zu tun versucht:
Ich versuche, die letzte bekannte Position aus den ArrayList zu entfernen Ich habe oben gepostet. Ich versuche, diese unten mit dem Code zu tun:

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

aber ich bin immer diese Fehlermeldung:

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 

Was mache ich falsch? Es soll den letzten bekannten Artikel aus meiner ArrayList entfernen.

Antwort

62

es sein sollte:

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

Oder Sie können

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

Die Minusfehler tun, weil Größe() gibt die Anzahl der Elemente, aber der Index der des Arraylist erste Element 0 und nicht 1.

+1

Beachten Sie, dass Sie beim Überschreiben von '.equals()' möglicherweise die letztere Version verwenden möchten, um sicherzustellen, dass es wirklich das letzte Objekt ist, das entfernt wird. –

+1

Ich glaube, Ihre erste Lösung würde nicht richtig funktionieren, wenn Duplikate in der Liste wären. Es kann jedoch auch Situationen geben, in denen Sie solche Funktionen wünschen. – Pijusn

+3

Es sollte beachtet werden, dass das Entfernen eines Objekts aus einer Array-Liste O (n) ist. Der zweite Ansatz ist eine konstante Zeit. – Alexander

0

Erster Fehler: Sie werfen aus irgendeinem Grund eine ClientThread als String.

Zweiter Fehler: Sie rufen remove nicht auf Ihrem List.

Ist es Hausaufgaben? Wenn ja, möchten Sie vielleicht das Tag verwenden.

8

Der Compiler beschwert sich, dass Sie etwas aus einer Liste von ClientThread Objekte zu einem String versuchen. Ändern Sie entweder den Typ hey in ClientThread oder clients in List<String>.

Zusätzlich: Gültige Indizes für Listen sind von 0 bis Größe() - 1.

So möchten Sie wahrscheinlich

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

+1 für die Erkenntnis, dass der Index, der an 'get()' übergeben wurde, falsch war, habe ich nicht verstanden. –

3

Sie schreiben sind versuchen, den Rückgabewert von clients.get(clients.size()) auf den String hey, zuweisen, aber das zurückgegebene Objekt ist ein ClientThread, kein String. Als Andre mentioned müssen Sie auch den richtigen Index verwenden.

Was Ihren zweiten Fehler betrifft, gibt es keine statische Methode remove() auf dem Typ ClientThread. Wirklich, Sie wollten wahrscheinlich die Remove-Methode Ihrer List Instanz, clients.

Sie können das letzte Element aus der Liste entfernen, falls vorhanden, wie folgt. Da Entfernen Sie auch das Objekt zurückgibt, die entfernt wurde, können Sie die Rückgabe erfassen und es verwenden, um den Namen zu drucken:

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 für die Überprüfung, ob die Liste leer ist oder nicht –

+0

+1 für die Verwendung von '.remove()' auf dem rechten Objekt. Imaginäres Extra +1 für die Verwendung des Rückgabewertes von remove(). –

1

clients.get eine ClientThread zurückkehren und kein String, und es wird mit einer IndexOutOfBoundsException bombardieren wenn es kompiliert werden würde, da Java für die Indizierung 0 ist.

Ähnlich denke ich, dass Sie das Entfernen auf der Kundenliste aufrufen sollten.

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

würde ich die Stack-Funktionen eines LinkedList in diesem Fall benutzen aber sehen http://download.oracle.com/javase/1.4.2/docs/api/java/util/LinkedList.html

ClientThread hey = clients.removeLast() 
6

Diese Linie bedeutet, dass Sie eine "Liste der ClientThread Objekte" instanziiert.

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

Diese Zeile hat zwei Probleme.

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

1. Dieser Teil der Leitung:

clients.get(clients.size()); 

IMMER wirft IndexOutOfBoundsException weil eine Sammlung Größe immer ist größer als seine letzten Elemente Index;

2. Compiler beschwert sich über inkompatible Typen, weil Sie dem Objekt String kein ClientThread-Objekt zuweisen können. Richtig sollte so sein.

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

Last but not least. Wenn Sie Index des Objekts wissen nur zu entfernen, schreiben

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

nicht

ClientThread hey = clients.get(23); 

    clients.remove(hey); 

schreiben Sie, weil Sie die Liste zwingen für den Index zu suchen, die Sie bereits kennen. Wenn Sie später etwas mit dem entfernten Objekt tun möchten. Schreiben

ClientThread hey = clients.remove(23); 

Auf diese Weise können Sie das Objekt entfernen und einen Verweis darauf in der gleichen Zeile erhalten.

Bonus: Nennen Sie niemals Ihre Instanzvariable mit dem Namen "hey". Finde etwas Sinnvolles.

Und hier ist Ihre korrigiert und ready-to-run-Code:

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; 

     } 

    } 
} 

Viel Spaß!

0

Sie müssen java generics verstehen. Sie haben eine Liste von ClientThread, aber versuchen, String zu bekommen. Sie haben andere Fehler, aber dieser ist sehr einfach.