Java 如何通过其类中的部分字段从集合中提取对象
假设我有课Java 如何通过其类中的部分字段从集合中提取对象,java,set,equals,Java,Set,Equals,假设我有课 public class CashCard { private String lastName; private int pinCode; private int balance; public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = las
public class CashCard {
private String lastName;
private int pinCode;
private int balance;
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getPinCode() {
return pinCode;
}
public void setPinCode(int pinCode) {
this.pinCode = pinCode;
}
public int getBalance() {
return balance;
}
public int takeMoney(int money) throws NotEnoughMoneyException {
if (money > balance)
throw new NotEnoughMoneyException();
balance -= money;
return money;
}
public int putMoney(int money) {
balance += money;
return money;
}
public CashCard(String lastName, int pinCode, int balance) {
this.lastName = lastName;
this.pinCode = pinCode;
this.balance = balance;
}
@Override
public boolean equals(Object o) {
if (o == null || o.getClass() != this.getClass())
return false;
if (o == this)
return true;
CashCard that = (CashCard) o;
return this.lastName.equals(that.lastName) && this.pinCode == that.pinCode;
}
@Override
public int hashCode() {
int result = 17;
int prime = 31;
result = result * prime + lastName.hashCode();
result = result * prime + pinCode;
return result;
}
}
这个类的要点是它有3个字段,但是对于这个类的2个对象,如果它们有相同的(等价的)两个字段,那么无论第三个字段是什么,它们都是相等的
接下来,例如,我有一组这样的对象
CashCard card1 = new CashCard("Goldman", 1111, 9000);
CashCard card2 = new CashCard("Miranda", 1234, 100);
CashCard card3 = new CashCard("Grey", 6969, 1000000);
Set<CashCard> cashCards = new HashSet<CashCard>();
cashCards.add(card1);
cashCards.add(card2);
cashCards.add(card3);
我需要弄清楚集合中是否包含具有这样名称和pincode的元素,如果是,则以某种方式更改集合中的元素。您无法直接提取与某个约束匹配的对象。你只能检查容器。要真正找到您要查找的特定对象,您必须使用迭代器对集合进行迭代,并将每个对象与您构建的对象进行比较。也就是说,做如下事情:
for (CashCard cc : cashCards)
if (cc.equals(new CashCard("Goldman", 1111, 0L))
cc.balance -= toDebit;
如果您没有在其他地方共享引用,您也可以删除现金卡并插入一个新的现金卡,其中包含更新的属性:
CashCard newCard = new CashCard("Goldman", 1111, newBalance);
cashCards.remove(newCard);
cashCards.add(newCard);
我强烈建议你重新考虑你的设计。从equals/hashcode中排除一个字段是真正的代码味道。考虑让<代码> CaskBooS/<代码>包含Name + PIN,并使用<代码> map BalCunMaP 作为余额。查看实现均衡器()和HASCODE(),创建子集CasCaskKy类,并使用MAP代替。您必须重复使用该集合,使用上面所建议的均衡器函数检查值,或者单独检查字符串。您是否考虑过使用地图,或者设置地图是一项要求?您已经描述了一些具有使它们等效的键(在本例中是一对值)的东西。那么相同的名称和相同的邮政编码呢?需要向类中添加自动增量id。讨厌自动更正是的,你是对的,我是说pin码。@Aeshang,仍然不确定你在说什么。这不是什么澄清。我不明白OP为什么需要添加一些自动增值id。比如说,如果你有两个对象的新现金卡(“aioobe”,“1234”,100);&新现金卡(“aioobe”、“1234”、10000);代码没有阻止这一点。。。当您对这个应用程序执行代码时会发生什么?根据返回的实例,它将扣除款项。
CashCard newCard = new CashCard("Goldman", 1111, newBalance);
cashCards.remove(newCard);
cashCards.add(newCard);