web-dev-qa-db-fra.com

Java - supprimer le dernier élément connu de ArrayList

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.

27
test

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.

76
jonescb

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);
8
Andre Holzner

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!

6
Kerem Baydoğan

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

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()
2
Peter Tillemans

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.

0
fastcodejava

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.

0
j flemm