好的,这是我的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
删除最后一个已知项目。
答案 0 :(得分:73)
应该是:
ClientThread hey = clients.get(clients.size() - 1);
clients.remove(hey);
或者你可以做到
clients.remove(clients.size() - 1);
减号是因为size()返回元素的数量,但ArrayList的第一个元素的索引是0而不是1.
答案 1 :(得分:8)
编译器抱怨您正在尝试ClientThread
String
个hey
个对象的列表。将ClientThread
的类型更改为clients
或List<String>
更改为 String hey = clients.get(clients.size()-1);
。
此外:列表的有效索引从0到size() - 1。
所以你可能想写
{{1}}
答案 2 :(得分:6)
此行表示您实例化了“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;
}
}
}
享受!
答案 3 :(得分:3)
您尝试将clients.get(clients.size())
的返回值分配给字符串hey
,但返回的对象是ClientThread
,而不是字符串。作为Andre mentioned,您还需要使用正确的索引。
就您的第二个错误而言,类型remove()
上没有静态方法ClientThread
。实际上,您可能想要List
实例{@ 1}}的删除方法。
您可以从列表中删除最后一项(如果有),如下所示。由于remove还会返回已删除的对象,因此您可以捕获返回并使用它来打印出名称:
clients
答案 4 :(得分:2)
clients.get
将返回ClientThread
而不是String
,如果基于索引编译Java为零,它将以IndexOutOfBoundsException
进行炸弹。
同样,我认为您应该在remove
列表中致电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());
虽然在这种情况下我会使用LinkedList
的堆栈函数。
ClientThread hey = clients.removeLast()
答案 5 :(得分:0)
第一个错误:由于某种原因,您将ClientThread
转换为String
。
第二个错误:您没有在remove
上致电List
。
是作业吗?如果是这样,您可能想要使用标记。
答案 6 :(得分:0)
您需要了解java generics。您有ClientThread
的列表,但尝试获取String
。您还有其他错误,但这个错误非常基本。