Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过其类中的部分字段从集合中提取对象_Java_Set_Equals - Fatal编程技术网

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);