Duncan
Duncan

Reputation: 1034

How do I change what it means for objects to be duplicate in a set?

I want to store a set of Edges:

class Edge {
    int u;
    int v;
    char symbol;
}

The problem is that it's possible for two Edge objects to have the same u, v and symbol, but they can both be stored in a HashSet because they're not the same object even though I want them to be considered the same object. How can I store only one object that has a unique (u, v, symbol) in a Set?

Upvotes: 1

Views: 72

Answers (3)

greedybuddha
greedybuddha

Reputation: 7507

You need to override the following two methods equals and hashcode.

public boolean equals(Object obj) {
    if (obj == null) return false;
    if (!(obj instanceof Edge)) return false;
    // return true if they are the same, otherwise false
}

public int hashCode() {
    // return an int that represents similarity
    // Example: name.hashCode(), if they are the same with the same name
}

Upvotes: 4

Martin Asenov
Martin Asenov

Reputation: 1298

Depends on what kind of set you want to use; The below applies for HashSet for instance, but not for any subclass of SortedSet

By overriding equals() and hashCode():

class Edge {
    int u;
    int v;
    char symbol;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + symbol;
        result = prime * result + u;
        result = prime * result + v;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;

        Edge other = (Edge) obj;

        return symbol == other.symbol && u == other.u && v == other.v;
    }
}

Upvotes: 1

zetches
zetches

Reputation: 148

You have to override equals(). Like this:

public boolean equals(Object obj) {
   //do the comparison here; remember to cast obj to Edge
}

Upvotes: 0

Related Questions