を使用して一意に生成されたIDによってクライアントを追跡するサーバーを作成しようとしていますHashMap<ClientID,Client>
。私が管理者で、サーバーから誰かを起動したい場合は、適切なClientID(実際には単なる文字列です。唯一の違いはClientIDクラスが2つのクライアントがないことを確認する作業を行うことです)を検索するという考え方です。そのクライアントに同じIDを割り当てたことがあります)、「キック12」などのコマンドを入力します(キックしたい人のClientIDがたまたま12だった場合)。私はこれがうまくいくと思ったので、HashMap
Objectから継承されたhashCode()メソッドの内部使用によってサポートされている可能性があり、それがtrueであると仮定して、必要なルックアップ操作をサポートするようにClientIDクラスを設計しました。しかし、明らかに、それは真実ではありません。同じハッシュコードを持つ2つのキーは、HashMap
(またはHashSet
)の同じキーとは見なされないようです。私がHashSet
やりたいことを説明するために、を使用して簡単な例を作成しました。
importjava.lang。*; java.io.*をインポートします。 importjava.util。*; クラスClientID{ プライベート文字列ID; public ClientID(String myId) {{ id = myId; } public static ClientID generateNew(Set <ClientID> previous) {{ ClientID res = new ClientID( ""); ランダムrand=new Random(); 行う { int p = rand.nextInt(10); res.id + = p; } while(existing.contains(res)); resを返します。 } public int hashCode() {{ return(id.hashCode()); } public boolean equals(String otherID) {{ return(id == otherID); } public boolean equals(ClientID other) {{ return(id == other.id); } public String toString() {{ IDを返します。 } public static void main(String [] args)はIOException{をスローします BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); HashSet <ClientID> mySet = new HashSet <ClientID>(); ClientID myId = ClientID.generateNew(mySet); mySet.add(myId); 文字列入力; 行う { System.out.println( "セット内のID/ハッシュコードのリスト:"); for(ClientID x:mySet) System.out.println( "\ t" + x.toString()+ "\ t" + x.hashCode()); System.out.print( "\ nセットに含まれているかどうかをテストするIDを入力してください:"); input = in.readLine(); if(input == null) 壊す; else if(input.length()== 0) 継続する; ClientID matchID = new ClientID(input); if(mySet.contains(matchID)) System.out.println( "Success!SetにはすでにそのIDが含まれています:)"); そうしないと { System.out.println("IDの追加"+ matchID.toString()+ "(hashcode" + matchID.hashCode()+ ")をセットに"); mySet.add(matchID); } System.out.println( "\ n"); } while(!input.toUpperCase()。equals( "QUIT")); } }
このコードを使用すると、(私が知る限り)出力を生成することは不可能です
成功!セットにはすでにそのIDが含まれています:)
...代わりに、値が重複している場合でも(つまり、equalsメソッドと等しく、同じハッシュコードを持っている場合でも)、そのセットに値を追加し続けます。私がこれをうまく伝えていない場合は、自分でコードを実行すると、私が何を意味するのかすぐにわかると思います...これにより、ルックアップが不可能になります(また、Client.generateNewメソッドが意図したとおりに機能しないことも意味します)に); どうすればこれを回避できますか?