Java - 从ArrayList中删除最后一个已知项

时间:2010-08-18 18:41:03

标签: 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删除最后一个已知项目。

7 个答案:

答案 0 :(得分:73)

应该是:

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

或者你可以做到

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

减号是因为size()返回元素的数量,但ArrayList的第一个元素的索引是0而不是1.

答案 1 :(得分:8)

编译器抱怨您正在尝试ClientThread Stringhey个对象的列表。将ClientThread的类型更改为clientsList<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。您还有其他错误,但这个错误非常基本。