を使用して一意に生成されたIDによってクライアントを追跡するサーバーを作成しようとしていますHashMap<ClientID,Client>。私が管理者で、サーバーから誰かを起動したい場合は、適切なClientID(実際には単なる文字列です。唯一の違いはClientIDクラスが2つのクライアントがないことを確認する作業を行うことです)を検索するという考え方です。そのクライアントに同じIDを割り当てたことがあります)、「キック12」などのコマンドを入力します(キックしたい人のClientIDがたまたま12だった場合)。私はこれがうまくいくと思ったので、HashMapObjectから継承された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メソッドが意図したとおりに機能しないことも意味します)に); どうすればこれを回避できますか?