ОК, поэтому вот мой 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
.
Это должно быть:
ClientThread hey = clients.get(clients.size() - 1);
clients.remove(hey);
Или вы можете сделать
clients.remove(clients.size() - 1);
Минусовые единицы связаны с тем, что size () возвращает количество элементов, но индекс первого элемента ArrayList равен 0, а не 1.
Компилятор жалуется, что вы пытаетесь использовать что-то из списка объектов ClientThread
для String
. Либо измените тип эй
на ClientThread
, либо клиентов
на Список
.
Дополнительно: Допустимые индексы для списков от 0 до size () - 1.
Так что вы, вероятно, захотите написать
String hey = clients.get(clients.size()-1);
Эта строка означает, что вы создали «Список объектов 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;
}
}
}
Наслаждайтесь!
Первая ошибка: по какой-то причине вы преобразовываете ClientThread
как String
.
Вторая ошибка: вы не вызываете удалить
из своего списка
.
Это домашнее задание? Если да, возможно, вы захотите использовать тег.
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()
Вам необходимо понимать java-дженерики . У вас есть список ClientThread
, но вы пытаетесь получить String
. У вас есть и другие ошибки, но эта очень простая.
Вы пытаетесь присвоить возвращаемое значение 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());
}