Supponiamo di avere una classe e di creare un HashSet che può memorizzare questa istanza di questa classe. Se si tenta di aggiungere istanze uguali, nella raccolta viene mantenuta una sola istanza e ciò va bene.Java HashSet contiene duplicati se l'elemento contenuto viene modificato
Tuttavia se si dispone di due istanze diverse nell'HashSet e ne si prende una e ne si fa una copia esatta dell'altro (copiando i campi), HashSet conterrà quindi due istanze duplicate.
Ecco il codice che dimostra questo:
public static void main(String[] args)
{
HashSet<GraphEdge> set = new HashSet<>();
GraphEdge edge1 = new GraphEdge(1, "a");
GraphEdge edge2 = new GraphEdge(2, "b");
GraphEdge edge3 = new GraphEdge(3, "c");
set.add(edge1);
set.add(edge2);
set.add(edge3);
edge2.setId(1);
edge2.setName("a");
for(GraphEdge edge: set)
{
System.out.println(edge.toString());
}
if(edge2.equals(edge1))
{
System.out.println("Equals");
}
else
{
System.out.println("Not Equals");
}
}
public class GraphEdge
{
private int id;
private String name;
//Constructor ...
//Getters & Setters...
public int hashCode()
{
int hash = 7;
hash = 47 * hash + this.id;
hash = 47 * hash + Objects.hashCode(this.name);
return hash;
}
public boolean equals(Object o)
{
if(o == this)
{
return true;
}
if(o instanceof GraphEdge)
{
GraphEdge anotherGraphEdge = (GraphEdge) o;
if(anotherGraphEdge.getId() == this.id && anotherGraphEdge.getName().equals(this.name))
{
return true;
}
}
return false;
}
}
L'output del codice precedente:
1 a
1 a
3 c
Equals
C'è un modo per forzare il HashSet per convalidare il suo contenuto in modo che eventuali voci duplicate creato come nello scenario precedente viene rimosso?
Una possibile soluzione potrebbe essere quella di creare un nuovo hashset e copiare il contenuto da un hashset a un altro in modo che il nuovo hashset non contenga duplicati, tuttavia non mi piace questa soluzione.
Ok, quindi lo scenario sopra non è valido. Immagino che l'unica opzione sia copiare il contenuto in un nuovo HashSet. –
@ Spi1988 La soluzione corretta è quella di attenersi al contratto di 'Set' e non modificare gli oggetti dopo averli aggiunti alla raccolta. – EJP
@PB_MLT cosa otterrai copiando il contenuto in un nuovo HashSet? – HungryForKnowledge