OK, voici donc mon ArrayList
:
private List<ClientThread> clients = new ArrayList<ClientThread>();
et voici ce que j'essaie de faire:
J'essaie de supprimer le dernier élément connu du ArrayList
que j'ai publié ci-dessus. J'essaie de le faire avec le code ci-dessous:
} 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());
}
mais je reçois cette erreur:
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
Qu'est-ce que je fais mal? Il est censé supprimer le dernier élément connu de mon ArrayList
.
CA devrait etre:
ClientThread hey = clients.get(clients.size() - 1);
clients.remove(hey);
Ou vous pouvez faire
clients.remove(clients.size() - 1);
Les moins sont parce que size () renvoie le nombre d'éléments, mais l'index du premier élément d'ArrayList est 0 et non 1.
Le compilateur se plaint que vous essayez quelque chose d'une liste d'objets ClientThread
dans un String
. Modifiez le type de hey
en ClientThread
ou clients
en List<String>
.
De plus: les indices valides pour les listes vont de 0 à size () - 1.
Vous voulez donc probablement écrire
String hey = clients.get(clients.size()-1);
Cette ligne signifie que vous avez instancié une "liste d'objets ClientThread".
private List<ClientThread> clients = new ArrayList<ClientThread>();
Cette ligne a deux problèmes.
String hey = clients.get(clients.size());
1. Cette partie de la ligne:
clients.get(clients.size());
TOUJOURS jette IndexOutOfBoundsException parce qu'une taille de collection est toujours une plus grande que son dernier index d'éléments;
2. Le compilateur se plaint de types incompatibles car vous ne pouvez pas affecter un objet ClientThread à un objet String. La bonne devrait être comme ça.
ClientThread hey = clients.get(clients.size()-1);
Enfin et surtout. Si vous connaissez l'index de l'objet à supprimer, écrivez simplement
clients.remove(23); //Lets say it is in 23. index
N'écris pas
ClientThread hey = clients.get(23);
clients.remove(hey);
car vous forcez la liste à rechercher l'index que vous connaissez déjà. Si vous prévoyez de faire quelque chose avec l'objet supprimé ultérieurement. Écrire
ClientThread hey = clients.remove(23);
De cette façon, vous pouvez supprimer l'objet et obtenir une référence à lui sur la même ligne.
Bonus: N'appelez jamais votre variable d'instance avec le nom "hey". Trouvez quelque chose de significatif.
Et voici votre code corrigé et prêt à fonctionner:
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;
}
}
}
Prendre plaisir!
Vous essayez d'affecter la valeur de retour de clients.get(clients.size())
à la chaîne hey
, mais l'objet renvoyé est un ClientThread
, pas une chaîne. Comme Andre l'a mentionné , vous devez également utiliser l'index approprié.
En ce qui concerne votre deuxième erreur, il n'y a pas de méthode statique remove()
sur le type ClientThread
. Vraiment, vous vouliez probablement la méthode remove de votre instance List
, clients
.
Vous pouvez supprimer le dernier élément de la liste, s'il y en a un, comme suit. Étant donné que remove renvoie également l'objet qui a été supprimé, vous pouvez capturer le retour et l'utiliser pour imprimer le nom:
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());
}
clients.get
renverra un ClientThread
et non un String
, et il bombardera avec un IndexOutOfBoundsException
s'il compilait comme Java est zéro basé sur l'indexation.
De même, je pense que vous devriez appeler remove
sur la liste clients
.
ClientThread hey = clients.get(clients.size()-1);
clients.remove(hey);
System.out.println(hey + " has logged out.");
System.out.println("CONNECTED PLAYERS: " + clients.size());
J'utiliserais les fonctions de pile d'un LinkedList
dans ce cas cependant.
ClientThread hey = clients.removeLast()
Vous devez comprendre génériques Java . Vous avez une liste de ClientThread
mais essayez d'obtenir String
. Vous avez d'autres erreurs, mais celle-ci est très basique.
Première erreur: vous transformez un ClientThread
en String
pour une raison quelconque.
Deuxième erreur: vous n'appelez pas remove
sur votre List
.
C'est des devoirs? Si c'est le cas, vous souhaiterez peut-être utiliser la balise.