tyson
tyson

Reputation: 31

Compare two set and remove common items

I have two sets which contain some elements as object. I want to remove common element from the set. How can I remove common elements from set?

Set<AcceptorInventory> updateList = new HashSet<AcceptorInventory>();
Set<AcceptorInventory> saveList = new HashSet<AcceptorInventory>();

Both sets have some items, the saveList have duplicated items & I wish to remove duplicated items from saveList. I tried with foreach loop, but it did not work.

Sample output:

save 5
save 20
save 50
save 10
update 5
update 10
update 20

AcceptorInventory Hashcode and equals

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + count;
    result = prime * result
            + ((currency == null) ? 0 : currency.hashCode());
    result = prime * result + ((date == null) ? 0 : date.hashCode());
    result = prime * result + (int) (id ^ (id >>> 32));
    result = prime * result + (isCleared ? 1231 : 1237);
    result = prime * result
            + ((kioskMachine == null) ? 0 : kioskMachine.hashCode());
    result = prime * result + ((time == null) ? 0 : time.hashCode());
    long temp;
    temp = Double.doubleToLongBits(total);
    result = prime * result + (int) (temp ^ (temp >>> 32));
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    AcceptorInventory other = (AcceptorInventory) obj;
    if (count != other.count)
        return false;
    if (currency == null) {
        if (other.currency != null)
            return false;
    } else if (!currency.equals(other.currency))
        return false;
    if (date == null) {
        if (other.date != null)
            return false;
    } else if (!date.equals(other.date))
        return false;
    if (id != other.id)
        return false;
    if (isCleared != other.isCleared)
        return false;
    if (kioskMachine == null) {
        if (other.kioskMachine != null)
            return false;
    } else if (!kioskMachine.equals(other.kioskMachine))
        return false;
    if (time == null) {
        if (other.time != null)
            return false;
    } else if (!time.equals(other.time))
        return false;
    if (Double.doubleToLongBits(total) != Double
            .doubleToLongBits(other.total))
        return false;
    return true;
}

Upvotes: 2

Views: 4053

Answers (2)

amit.mevada
amit.mevada

Reputation: 103

You can remove common items from current saveList using

saveList.removeAll(updateList);

Upvotes: 2

Eran
Eran

Reputation: 393801

updateList.removeAll(saveList);

would remove from updateList all the elements of saveList.

If you also want to remove from saveList the elements of updateList, you'll have to create a copy of one of the sets first :

Set<AcceptorInventory> copyOfUpdateList = new HashSet<>(updateList);
updateList.removeAll (saveList);
saveList.removeAll (copyOfUpdateList);

Note that in order for your AcceptorInventory to function properly as an element of a HashSet it must override the equals and hashCode methods, and any two AcceptorInventory which are equal must have the same hashCode.

Upvotes: 2

Related Questions