HashSet ne semblent pas réaliser que les deux objets sont les mêmes.
Je suis en train d'utiliser HashSet de stocker des objets d'une classe que j'ai créé, mais apparemment les mêmes objets semblent avoir deux tables de hachage, c'est pourquoi la méthode contains ne se rendent pas compte que l'objet est déjà dans le HashSet. Ce qui me conduit à mon programme en cours d'exécution hors de la mémoire du tas.
Je ne pense pas que je suis en train de faire quelque chose de mal, mais je voulais un deuxième avis de toute façon. J'ai fait des opérations similaires devant laquelle tout a bien fonctionné, ce qui le rend particulièrement gênant. J'apprécierais toute aide.
Voici mon code
move1 = new Move(t,s);
if(move1.hashCode()==new Move(t,s).hashCode())
System.out.println("match");
move2 = new Move(s,t);
moves.add(move1);
moves.add(move2);
if(moves.contains(new Move(t,s)))
System.out.println("match found");
Ici est le mouvement de la classe:
public class Move {
private int move1;
private int move2;
Move(int m1, int m2)
{
move1 = m1;
move2 = m2;
}
public String toString()
{
return String.valueOf(move1)+" "+String.valueOf(move2);
}
}
Ici la sortie-je obtenir
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.addEntry(HashMap.java:797)
at java.util.HashMap.put(HashMap.java:431)
at java.util.HashSet.add(HashSet.java:194)
at makeMove.<init>(makeMove.java:33)
- Utilisé, étant donné que l'exception est un effet secondaire du problème.
Vous devez vous connecter pour publier un commentaire.
Vous devez remplacer la
Objet#hashCode()
méthode dans leMove
classe de la laisser revenir le mêmehashCode()
de la valeur pour l'état de laMove
instance. N'oubliez pas de remplacerObjet#equals()
ainsi.Voir aussi:
Soupçon: si vous utilisez un IDE comme Eclipse, vous pouvez également générer automatiquement entre eux. Faites un clic droit quelque part le
Move
classe, choisissez Source > Générer hashCode() et equals(). Voici à quoi il ressemble alors:HashSet permettra de déterminer l'égalité fondée sur l'appel de hashCode() et equals(). Vous n'avez pas mis en œuvre, de sorte que vous aurez inherite de l'Objet. Le hashCode et equals méthodes de l'Objet est simplement de savoir si les références sont égaux.
C'est pourquoi
if(move1.hashCode()==new Move(t,s).hashCode())
est faux. move1 est un autre exemple de l'instance créée par l'appelant de nouveaux Déplacer(t,s).hashCode()Vous aurez besoin de mettre en œuvre hashCode et equals dans votre Déménagement de classe.
par exemple(mais peut-être pas optimal, et vous voudrez peut-être un null coffre-fort est égal à - votre IDE de les générer, si elle le peut),
Vous devez remplacer les equals() et hasCode()
Cela peut être une option.
Vous devez définir si la commande du déplacement est concerné ( 1,2 isequals à 2,1 ou pas )
Pour plus d'informations:
Quelles questions devraient être examinées lors de la substitution equals et hashCode en Java?
Article 8: toujours remplacer hashCode lorsque vous remplacez égal dans: "Effective Java" http://bit.ly/cd7uUl