从hashset中删除object元素

vnzz0bqm  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(257)

我正在做一个钱包,已经从基本的开始。我将penny对象添加到存储钱的哈希集中。我将容量初始化为5,然后从一个满钱包开始。
当尝试花费一分钱时,返回null(如预期的那样),但是当调用moneycheck()方法时,仍然有5个硬币。
我不知道该怎么做,因为我正在尝试使用.remove()方法删除一分钱,并且该对象没有从hashset中删除。
任何指示都将不胜感激。谢谢您

import java.util.HashSet;

public class Wallet{
    private HashSet<Penny> walletPenny;

    public Wallet(){
        int walletCapacity = 5;
        walletPenny = new HashSet<>();

        int counter = 0;
        while (counter < pocketCapacity){
            pocketPenny.add(new Penny());
            counter++;
        }
    }

    public Penny removePenny(){
        Penny spentPenny = null;

        if (walletPenny.isEmpty()){
            System.out.print("No more pennies!\n");
            return spentPenny;
        }
        else {
            pocketPenny.remove(spentPenny);
            System.out.println(("Spent penny!"));
        }
        return spentPenny;
    }
}

    public int moneyCheck(){
        System.out.print("Money remaining: " + walletPenny.size() + "\n");
        return walletPenny.size();
    }
xmd2e60i

xmd2e60i1#

当你试着把硬币拿出来的时候 pocketPenny.remove(spentPenny) ,java试图找到要删除的便士。为了做到这一点,它使用 equals 并迭代 HashSet 直到它找到一分钱,这是相等的(身份智慧)你的 spentPenny . 更多关于如何 remove() 作品。因为你提供了null作为 spentPenny ,它将不匹配任何内容(您的5个便士已初始化,因此它们不为空)。如果您检查 .remove() 方法-它将是 false .
要解决此问题,您需要:
在调用 remove() 方法
默许 equals() 在你的 Penny
跟踪您创建的硬币,以便以后删除它们
完整示例:

public class Penny {

    private final int serialNum;

    public Penny(int serialNum) {
        this.serialNum = serialNum;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 79 * hash + this.serialNum;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Penny other = (Penny) obj;
        return this.serialNum == other.serialNum;
    }

}

然后创造你的硬币:

int counter = 0;
        while (counter < pocketCapacity){
            pocketPenny.add(new Penny(counter));
            counter++;
        }

现在你有5个硬币,从0到4。您可以删除一个,例如#3:

Penny spentPenny = new Penny(3);
pocketPenny.remove(spentPenny);
sr4lhrrt

sr4lhrrt2#

找到了答案,我想我会更新这个,以防其他人有同样的问题。
为了删除penny,我用迭代器初始化了penny对象,以查找hashset中的下一个可用对象。然后我返回该值以在程序的其他地方使用。

public Penny removePenny(){
        Penny spentPenny;

        if (walletPenny.isEmpty()){
            System.out.print("No more pennies!\n");
            spentPenny = null;
            return spentPenny;
        }
        else {
            spentPenny = walletPenny.iterator().next();
            walletPenny.remove(spentPenny);
            System.out.println(("Spent penny!"));
            return spentPenny;
        }
    }

相关问题