好的,所以这是我的ArrayList:
private List<ClientThread> clients = new ArrayList<ClientThread>();
Run Code Online (Sandbox Code Playgroud)
这就是我想要做的事情:
我正在尝试删除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());
}
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误:
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
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?它应该删除我的最后一个已知项目ArrayList.
jon*_*scb 78
它应该是:
ClientThread hey = clients.get(clients.size() - 1);
clients.remove(hey);
Run Code Online (Sandbox Code Playgroud)
或者你可以做到
clients.remove(clients.size() - 1);
Run Code Online (Sandbox Code Playgroud)
减号是因为size()返回元素的数量,但ArrayList的第一个元素的索引是0而不是1.
编译器抱怨你正在尝试一些ClientThread对象列表String.要么改变heyto ClientThread或clientsto 的类型List<String>.
另外:列表的有效索引从0到size() - 1.
所以你可能想写
String hey = clients.get(clients.size()-1);
Run Code Online (Sandbox Code Playgroud)
此行表示您实例化了"ClientThread对象列表".
private List<ClientThread> clients = new ArrayList<ClientThread>();
Run Code Online (Sandbox Code Playgroud)
这条线有两个问题.
String hey = clients.get(clients.size());
Run Code Online (Sandbox Code Playgroud)
1.这部分内容:
clients.get(clients.size());
Run Code Online (Sandbox Code Playgroud)
总是抛出IndexOutOfBoundsException,因为集合大小总是比最后一个元素索引大一个;
2.编译器抱怨不兼容的类型,因为您无法将ClientThread对象分配给String对象.正确的应该是这样的.
ClientThread hey = clients.get(clients.size()-1);
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的.如果你知道要删除的对象的索引只是写
clients.remove(23); //Lets say it is in 23. index
Run Code Online (Sandbox Code Playgroud)
别写了
ClientThread hey = clients.get(23);
clients.remove(hey);
Run Code Online (Sandbox Code Playgroud)
因为您强制列表搜索您已经知道的索引.如果您打算稍后对删除的对象执行某些操作.写
ClientThread hey = clients.remove(23);
Run Code Online (Sandbox Code Playgroud)
这样,您可以删除对象并在同一行获取对它的引用.
额外奖励:永远不要使用名称"嘿"调用您的实例变量.找到有意义的东西
以下是您已更正并准备好运行的代码:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
请享用!