クラスがあり、このクラスのこのインスタンスを格納できるHashSetを作成したとします。等しいインスタンスを追加しようとすると、コレクション内に1つのインスタンスしか保持されず、それは問題ありません。含まれている要素が変更された場合、Java HashSetに重複が含まれます
しかし、HashSetに2つの異なるインスタンスがあり、それを1つ取ってそれを他のものと完全にコピーすると(フィールドをコピーすることによって)、HashSetは2つの重複インスタンスを含みます。ここで
はこのことを示すコードです:
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;
}
}
上記のコードの出力:
1 a
1 a
3 c
Equals
は、その内容となるよう可能な重複したエントリを検証するためにHashSetのを強制する方法はあります上記のように作成されたシナリオは削除されますか?
新しいハッシュセットを作成してその内容をあるハッシュセットから別のハッシュセットにコピーして、新しいハッシュセットに重複が含まれないようにすることができます。
そう、上記のシナリオは無効です。私は唯一のオプションは、新しいHashSetに内容をコピーすることだと思います。 –
@ Spi1988正しい解決策は、 'Set'の契約に固執し、オブジェクトをコレクションに追加した後にオブジェクトを変更しないことです。 – EJP
@PB_MLT内容を新しいHashSetにコピーすることで、あなたは何を達成しますか? – HungryForKnowledge