Подтвердить что ты не робот

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.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Компилятор жалуется, что вы пытаетесь сделать что-то из списка объектов ClientThread в String. Либо измените тип hey на ClientThread, либо clients на List<String>.

Кроме того: действительные индексы для списков от 0 до размера() - 1.

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

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

Ответ 3

Эта строка означает, что вы создали экземпляр "Список объектов 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);

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

   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;

        }

    }
}

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

Ответ 4

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

Что касается вашей второй ошибки, то нет статического метода remove() для типа ClientThread. На самом деле вам, скорее всего, нужен метод удаления вашего экземпляра 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());
}

Ответ 5

client.get вернет ClientThread, а не String, и он будет бомбить с помощью IndexOutOfBoundsException, если он будет скомпилирован, поскольку для индексации используется 0.

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

                        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, но см. http://download.oracle.com/javase/1.4.2/docs/api/java/util/LinkedList.html

ClientThread hey = clients.removeLast()

Ответ 6

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

Вторая ошибка: вы не вызываете remove на свой List.

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

Ответ 7

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