Java - удалить последний известный элемент из ArrayList

ОК, поэтому вот мой ArrayList :

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

и вот что я пытаюсь сделать:
Я пытаюсь удалить последний известный элемент из ArrayList , который я разместил выше. Я пытаюсь сделать это с кодом ниже:

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

, но я получаю эту ошибку:

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

Что я делаю не так? Предполагается удалить последний известный элемент из моего ArrayList .

28
задан River 14 June 2016 в 11:40
поделиться

7 ответов

Это должно быть:

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

Или вы можете сделать

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

Минусовые единицы связаны с тем, что size () возвращает количество элементов, но индекс первого элемента ArrayList равен 0, а не 1.

78
ответ дан 28 November 2019 в 02:21
поделиться

Компилятор жалуется, что вы пытаетесь использовать что-то из списка объектов ClientThread для String . Либо измените тип эй на ClientThread , либо клиентов на Список .

Дополнительно: Допустимые индексы для списков от 0 до size () - 1.

Так что вы, вероятно, захотите написать

   String hey = clients.get(clients.size()-1);
8
ответ дан 28 November 2019 в 02:21
поделиться

Эта строка означает, что вы создали «Список объектов ClientThread».

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

У этой строки две проблемы.

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

1. Эта часть строки:

clients.get(clients.size());

ВСЕГДА выбрасывает IndexOutOfBoundsException , потому что размер коллекции всегда на единицу больше, чем ее индекс последнего элемента;

2. Компилятор жалуется на несовместимые типы, потому что вы не можете назначить объект ClientThread объекту String. Правильный должен быть таким.

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

И последнее, но не менее важное. Если вы знаете индекс удаляемого объекта, просто напишите

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

Не пишите

   ClientThread hey = clients.get(23); 

   clients.remove(hey);

, потому что вы заставляете список искать индекс, который вам уже известен. Если вы планируете что-то делать с удаленным объектом позже. Write

   ClientThread hey = clients.remove(23); 

Таким образом вы можете удалить объект и получить ссылку на него в той же строке.

Бонус: никогда не вызывайте переменную экземпляра с именем «эй». Найдите что-нибудь значимое.

А вот ваш исправленный и готовый к работе код:

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;

        }

    }
}

Наслаждайтесь!

6
ответ дан 28 November 2019 в 02:21
поделиться

Первая ошибка: по какой-то причине вы преобразовываете ClientThread как String .

Вторая ошибка: вы не вызываете удалить из своего списка .

Это домашнее задание? Если да, возможно, вы захотите использовать тег.

0
ответ дан 28 November 2019 в 02:21
поделиться

clients.get вернет ClientThread , а не String , и он будет бомбить с IndexOutOfBoundsException , если он будет компилироваться как Java с нуля для индексации.

Точно так же, я думаю, вам следует вызвать remove в списке клиентов .

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

В этом случае я бы использовал функции стека из LinkedList .

ClientThread hey = clients.removeLast()
2
ответ дан 28 November 2019 в 02:21
поделиться

Вам необходимо понимать java-дженерики . У вас есть список ClientThread , но вы пытаетесь получить String . У вас есть и другие ошибки, но эта очень простая.

0
ответ дан 28 November 2019 в 02:21
поделиться

Вы пытаетесь присвоить возвращаемое значение clients.get(clients.size()) строке hey, но возвращаемый объект - это ClientThread, а не строка. Как упомянул Andre, вам также нужно использовать правильный индекс.

Что касается вашей второй ошибки, то для типа ClientThread не существует статического метода remove(). На самом деле, вам, скорее всего, нужен метод remove вашего экземпляра List, clients.

Вы можете удалить последний элемент из списка, если он есть, следующим образом. Поскольку remove также возвращает объект, который был удален, вы можете перехватить возврат и использовать его для печати имени:

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
ответ дан 28 November 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: