如何从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
相关产品推荐
相关产品推荐

