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

tes*_*est 28 java arraylist

好的,所以这是我的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.

  • 应该注意,从数组列表中删除对象是O(n).第二种方法是恒定时间. (3认同)
  • 我相信如果列表中有重复项,您的第一个解决方案将无法正常工作。但是,在某些情况下,您可能需要这种功能。 (2认同)

And*_*ner 8

编译器抱怨你正在尝试一些ClientThread对象列表String.要么改变heyto ClientThreadclientsto 的类型List<String>.

另外:列表的有效索引从0到size() - 1.

所以你可能想写

   String hey = clients.get(clients.size()-1);
Run Code Online (Sandbox Code Playgroud)


Ker*_*ğan 6

此行表示您实例化了"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)

请享用!