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
から最後の既知のアイテムを削除することになっています。
そのはず:
ClientThread hey = clients.get(clients.size() - 1);
clients.remove(hey);
またはあなたがすることができます
clients.remove(clients.size() - 1);
マイナス1は、size()が要素の数を返すが、ArrayListの最初の要素のインデックスが1ではなく0であるためです。
コンパイラは、ClientThread
オブジェクトのリストのいずれかをString
にしようとしていると文句を言います。 hey
のタイプをClientThread
に変更するか、clients
をList<String>
に変更します。
さらに、リストの有効なインデックスは0〜size()-1です。
だからあなたはおそらく書きたい
String hey = clients.get(clients.size()-1);
この行は、「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;
}
}
}
楽しい!
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());
}
clients.get
はClientThread
ではなく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()
Javaジェネリック を理解する必要があります。 ClientThread
のリストがありますが、String
を取得しようとしています。他にもエラーがありますが、これは非常に基本的なものです。
最初のエラー:何らかの理由でClientThread
をString
としてキャストしています。
2番目のエラー:remove
でList
を呼び出していません。
宿題はありますか?その場合、タグを使用することをお勧めします。