web-dev-qa-db-ja.com

Java-ArrayListから最後の既知のアイテムを削除

OK、だからここに私の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から最後の既知のアイテムを削除することになっています。

27
test

そのはず:

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

またはあなたがすることができます

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

マイナス1は、size()が要素の数を返すが、ArrayListの最初の要素のインデックスが1ではなく0であるためです。

76
jonescb

コンパイラは、ClientThreadオブジェクトのリストのいずれかをStringにしようとしていると文句を言います。 heyのタイプをClientThreadに変更するか、clientsList<String>に変更します。

さらに、リストの有効なインデックスは0〜size()-1です。

だからあなたはおそらく書きたい

   String hey = clients.get(clients.size()-1);
8
Andre Holzner

この行は、「ClientThreadオブジェクトのリスト」をインスタンス化したことを意味します。

private List<ClientThread> clients = new ArrayList<ClientThread>();

この行には2つの問題があります。

String hey = clients.get(clients.size());

1。行のこの部分:

clients.get(clients.size());

[〜#〜] always [〜#〜] throws IndexOutOfBoundsExceptionコレクションのサイズは常に最後の要素のインデックスよりも1つ大きいため。

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); 

この方法で、オブジェクトを削除し、同じ行でそのオブジェクトへの参照を取得できます。

ボーナス:「hey」という名前のインスタンス変数を呼び出さないでください。何か意味のあるものを見つけてください。

そして、修正済みですぐに実行できるコードを次に示します。

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;

        }

    }
}

楽しい!

6
Kerem Baydoğan

clients.get(clients.size())の戻り値を文字列heyに割り当てようとしていますが、返されるオブジェクトは文字列ではなくClientThreadです。 Andre前述 のように、適切なインデックスも使用する必要があります。

2番目のエラーに関する限り、ClientThread型にはremove()という静的メソッドはありません。本当に、Listインスタンス、clientsのremoveメソッドが必要でした。

次のように、リストから最後のアイテムがあれば、それを削除できます。 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());
}
3
Tim Stone

clients.getClientThreadではなくStringを返し、Java is zeroとしてコンパイルする場合は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()
2
Peter Tillemans

Javaジェネリック を理解する必要があります。 ClientThreadのリストがありますが、Stringを取得しようとしています。他にもエラーがありますが、これは非常に基本的なものです。

0
fastcodejava

最初のエラー:何らかの理由でClientThreadStringとしてキャストしています。

2番目のエラー:removeListを呼び出していません。

宿題はありますか?その場合、タグを使用することをお勧めします。

0
j flemm