You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从HashSet中移除自定义类对象?Java代码问题求助

问题分析与解决

你的代码存在两个核心问题:

  • remove()方法参数错误:myset.remove(Penny);传入的是Penny类本身,但HashSet的remove()需要传入具体的Penny实例对象,而非类。
  • 方法未返回指定类型值:removePenny()声明返回Penny对象,但当前逻辑里没有返回被移除的对象,编译无法通过。

修正后的代码示例:

public class Pocket {
    private HashSet<Penny> myset;
    
    public Pocket(int PocketSize) {
        myset = new HashSet<>();
        while (PocketSize > myset.size()) {
            myset.add(new Penny());
        }
    }
    
    public int pennyCount() {
        return myset.size();
    }
    
    public Penny removePenny() {
        if (!myset.isEmpty()) {
            // 取出集合中的一个Penny实例(HashSet无序,取第一个即可)
            Penny toRemove = myset.iterator().next();
            myset.remove(toRemove);
            return toRemove; // 返回被移除的对象
        } else {
            return null;
        }
    }
}

额外注意:必须给Penny类重写equals()和hashCode()

HashSet判断对象是否相等依赖这两个方法,如果Penny类没有重写,即使逻辑上相同的对象,HashSet也会判定为不同,可能导致remove()失效。示例如下:

import java.util.Objects;

public class Penny {
    // 可根据实际需求添加属性,比如面值
    private int faceValue;

    public Penny() {
        this.faceValue = 1;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Penny penny = (Penny) o;
        return faceValue == penny.faceValue;
    }

    @Override
    public int hashCode() {
        return Objects.hash(faceValue);
    }
}

修改完成后,removePenny()就能正常从集合中移除并返回一个Penny对象了。

内容的提问来源于stack exchange,提问作者iadnhaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:45:26